spool 3_alterPackageBody.log

CREATE OR REPLACE PACKAGE BODY CONNEG.PQ_ARCHIVO AS

  /***********************************************************************
  NOMBRE:     PQ_ARCHIVO
  PROPOSITO:  Agrupacion de funcionalidad para carga de archivos

  REVISIONES:
  Version      Fecha        Autor           Descripcion
  ---------  ----------  ---------------   -----------------------------
  1.0        05/09/2011  Alexander Yong     Creacion
  2.0        06/08/2014  Everis             Optimizacion del proceso
  ***********************************************************************/

  /*****************************************************************************
   * Genera los registros en la lotearchivo para el seguimiento de los lotes.  *
   *****************************************************************************/
  FUNCTION P_REGISTRAR_LOTEARCHIVO(AN_CODARCHIVO NUMBER, AC_NOMBARCH VARCHAR2)
    RETURN NUMBER
  IS
    LN_IDLOTE NUMBER(10);
  BEGIN
    SELECT MAX(IDLOTE) + 1 INTO LN_IDLOTE FROM LOTEARCHIVO; -- Cambiar por secuencia

    IF LN_IDLOTE IS NULL THEN
      LN_IDLOTE := 1;
    END IF;

    INSERT INTO LOTEARCHIVO(IDLOTE, CODIGOARCHIVO, NOMBREARCHIVO, FECHAINICIO, ESTADO)
    VALUES (LN_IDLOTE, AN_CODARCHIVO, AC_NOMBARCH, SYSDATE, G_ESTADO_CARGA_ENPROCESO);

    COMMIT;

    RETURN LN_IDLOTE;
  END P_REGISTRAR_LOTEARCHIVO;
  
  /*****************************************************************************
   * Actualizar el estado del lote.                                            *
   *****************************************************************************/
  PROCEDURE P_ACTUALIZAR_LOTEARCHIVO(P_LOTEARCHIVO IN LOTEARCHIVO%ROWTYPE)
  IS
  BEGIN
    UPDATE LOTEARCHIVO
    SET    FECHAFIN          = (CASE WHEN P_LOTEARCHIVO.ESTADO = G_ESTADO_CARGA_ENPROCESO THEN NULL ELSE SYSDATE END),
           ESTADO            = P_LOTEARCHIVO.ESTADO,
           CANTIDADREGISTROS = P_LOTEARCHIVO.CANTIDADREGISTROS,
           CANTIDADCORRECTOS = P_LOTEARCHIVO.CANTIDADCORRECTOS,
           CANTIDADERRADOS   = P_LOTEARCHIVO.CANTIDADERRADOS
    WHERE  IDLOTE            = P_LOTEARCHIVO.IDLOTE;
  END P_ACTUALIZAR_LOTEARCHIVO;
  
  /*****************************************************************************
   * Genera query dinamico para la generacion del archivo                      *
   *****************************************************************************/
  FUNCTION F_GENERA_QUERY(AN_CODARCHIVO NUMBER, ln_idlote NUMBER) RETURN VARCHAR2 IS

    CURSOR C_ARCHIVOLAYOUT IS
      SELECT CAMPOTABLA, LONGITUD, TIPODATO
        FROM ARCHIVOLAYOUT
       WHERE CODIGOARCHIVO = AN_CODARCHIVO
         AND FLAGACTIVO = 1
       ORDER BY POSICION ASC;

    LC_QUERY VARCHAR2(5000);
    LC_CAMPO VARCHAR2(200);
    LC_TABLA VARCHAR2(100);

  BEGIN
    SELECT TABLA
      INTO LC_TABLA
      FROM ARCHIVO
     WHERE CODIGOARCHIVO = AN_CODARCHIVO;--salidacuenta

    LC_QUERY := 'SELECT ';

    FOR LR_ARCHIVOLAYOUT IN C_ARCHIVOLAYOUT LOOP
      IF LR_ARCHIVOLAYOUT.TIPODATO = 'C' THEN
        LC_CAMPO := 'RPAD(NVL(TO_CHAR(' || LR_ARCHIVOLAYOUT.CAMPOTABLA || '),'' ''),' ||
                    LR_ARCHIVOLAYOUT.LONGITUD || ',' || '''' || ' ' || '''' || ')';
      ELSIF LR_ARCHIVOLAYOUT.TIPODATO = 'N' THEN
        LC_CAMPO := 'LPAD(NVL(TO_CHAR(' || LR_ARCHIVOLAYOUT.CAMPOTABLA || '),''0''),' ||
                    LR_ARCHIVOLAYOUT.LONGITUD || ',' || '''' || ' ' || '''' || ')';
      ELSE
        LC_CAMPO := LR_ARCHIVOLAYOUT.CAMPOTABLA;
      END IF;
      LC_QUERY := LC_QUERY || LC_CAMPO || '||';
    END LOOP;

    LC_QUERY := RTRIM(LC_QUERY, '||');
    LC_QUERY := LC_QUERY || ' FROM ' || LC_TABLA || ' WHERE LOTE_ID = ' || ln_idlote;

    RETURN LC_QUERY;

  END F_GENERA_QUERY;
  
  /*****************************************************************************
   * Genera archivo.                                                           *
   *****************************************************************************/
  PROCEDURE P_GENERAR_ARCHIVO(AN_CODARCHIVO IN NUMBER, P_LOTE_ID OUT INTEGER) IS
    ID                 INTEGER;
    RESULTADO          INTEGER;
    LC_QUERY           VARCHAR2(5000);
    LC_LINEA           VARCHAR(5000);
    LC_RUTA_ARCHIVO    VARCHAR2(2000);
    LC_NOM_ARCHIVO     VARCHAR2(2000);
    LB_ARCHIVO_ABIERTO BOOLEAN DEFAULT FALSE;
    ARCHIVO            UTL_FILE.FILE_TYPE;
    lc_proc_llenado    VARCHAR2(500);
    L_LOTEARCHIVO      LOTEARCHIVO%ROWTYPE;
    L_CANTIDAD         INTEGER := 0;
  BEGIN

    SELECT NOMBREARCHIVO || TO_CHAR(SYSDATE, 'yymmdd') || '.' ||
           EXTENSION,
           RUTASALIDA, proc_llenado
           INTO
           LC_NOM_ARCHIVO, LC_RUTA_ARCHIVO, lc_proc_llenado
    FROM ARCHIVO
    WHERE CODIGOARCHIVO = AN_CODARCHIVO;

    P_LOTE_ID := P_REGISTRAR_LOTEARCHIVO(AN_CODARCHIVO, LC_NOM_ARCHIVO);--3518,PEBT.BGFD.FIX.OPSALTAM.CTASPER.D1130626.TXT

    --insert into conneg.testmane (dato1) values(P_LOTE_ID);

    lc_proc_llenado := 'Begin '||lc_proc_llenado||'('||P_LOTE_ID||'); end;';--3506
    --insert into conneg.testmane (dato1) values(lc_proc_llenado);
    --EXECUTE IMMEDIATE lc_proc_llenado INTO ln_idlote;
    EXECUTE IMMEDIATE lc_proc_llenado;
    --insert into conneg.testmane (dato1) values('llego1');
    --ln_idlote:=2;
    LC_QUERY := F_GENERA_QUERY(AN_CODARCHIVO, P_LOTE_ID);

    ID := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(ID, LC_QUERY, DBMS_SQL.NATIVE);
    DBMS_SQL.DEFINE_COLUMN(ID, 1, LC_LINEA, 5000);
    RESULTADO := DBMS_SQL.EXECUTE(ID);

    IF NOT LB_ARCHIVO_ABIERTO THEN
          ARCHIVO            := UTL_FILE.FOPEN(LC_RUTA_ARCHIVO,LC_NOM_ARCHIVO,'w');
          LB_ARCHIVO_ABIERTO := TRUE;
    END IF;

    LOOP
      IF DBMS_SQL.FETCH_ROWS(ID) > 0 THEN
        DBMS_SQL.COLUMN_VALUE(ID, 1, LC_LINEA);
        LC_LINEA := LC_LINEA || CHR(13);
        UTL_FILE.PUT_LINE(ARCHIVO, LC_LINEA);
        L_CANTIDAD := L_CANTIDAD + 1;
      ELSE
        DBMS_SQL.CLOSE_CURSOR(ID);
        EXIT;
      END IF;
    END LOOP;

    IF LB_ARCHIVO_ABIERTO THEN
        UTL_FILE.FFLUSH(ARCHIVO);      
      --UTL_FILE.FCLOSE(ARCHIVO);
    END IF;

    L_LOTEARCHIVO.IDLOTE            := P_LOTE_ID;
    L_LOTEARCHIVO.CANTIDADREGISTROS := L_CANTIDAD;
    L_LOTEARCHIVO.CANTIDADCORRECTOS := L_CANTIDAD;
    L_LOTEARCHIVO.CANTIDADERRADOS   := 0;
    L_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_TERMINADO;

    P_ACTUALIZAR_LOTEARCHIVO(L_LOTEARCHIVO);--3490
    UTL_FILE.FCLOSE(ARCHIVO);
  END P_GENERAR_ARCHIVO;

  PROCEDURE SP_CARGAR_EXP_CUENTA(P_LOTE_ID IN INTEGER)--3498
  IS
    L_NUMERO_FIC INTEGER;
    L_CODIGO_OPE VARCHAR2(100);
    L_FLAGHOST INTEGER := 0;
    P_CODIGO_OPE_HOST_CHEQUE NVARCHAR2(3);
    L_CODIGO_OPE_RET VARCHAR2(100);
  BEGIN
    SELECT SUBSTR(VALORALFANUMERICO, 1, 3) INTO L_CODIGO_OPE_RET  FROM PARAMETRO WHERE CODIGOPARAMETRO = 4202;
    BEGIN
        SELECT SUBSTR(VALORALFANUMERICO, 1, 3) INTO L_CODIGO_OPE FROM PARAMETRO WHERE CODIGOPARAMETRO = 4201;
    EXCEPTION
      WHEN OTHERS THEN
          L_CODIGO_OPE := '   ';
    END;
    
    SELECT COUNT(1) INTO L_NUMERO_FIC FROM INICIOAPLICACION;
    
    -- VERIFICAMOS SI EL CHECK DE LA OPERACION ESTA HABILIDADO
    FOR TRANSACCION IN (SELECT TRANS.FLAGENVIARHOST, TRANS.CODIGOTRANSACCION
                FROM CONNEG.TRANSACCION TRANS
                WHERE TRANS.CODIGOTRANSACCION IN (3,5))
    LOOP
      IF TRANSACCION.FLAGENVIARHOST = 1 THEN
        --REGISTRAMOS LOS DEPOSITOS Y RETIROS DE EFECTIVO
        INSERT INTO SALIDACUENTA(CODIGOSECUENCIAL,INTERFACE,NUMERO_FIC,CCC,CENTRO_ORI,USERID_ORI,IMPORTE,DIVISA,OBSERVA,FILLER1,CODIGO,SIGNO_OPER,FILLER2,LOTE_ID,F_ANULA)
        SELECT SQ_SALIDACUENTA.NEXTVAL,
               'HQ' INTERFACE,
               L_NUMERO_FIC  NUMERO_FIC,
               CODIGOENTIDAD || CODIGOOFICINA || NUMEROCUENTA CCC,
               OFICINAREGISTRO CENTRO_ORI,
               USUARIOREGISTRO USERID_ORI,
               FN_FORMATO_MONTO_HOST_CI_C(IMPORTETOTAL)    IMPORTE,
               CODIGODIVISA                        DIVISA,
               DESCRIPCIONOBSERVACION              OBSERVA,
               FN_OPERACION_HOST(CODIGOTRANSACCION)   FILLER1,
                FN_OPERACION_CODIGO(CODIGOTRANSACCION)   CODIGO,
               (CASE WHEN CODIGOTRANSACCION = 3 THEN 'I' ELSE 'R' END) SIGNO_OPER,
               '000000000'  FILLER2,
               P_LOTE_ID,
               FLAGEXTORNO F_ANULA
        FROM   OPERACIONEFECTIVO
        WHERE  CODIGOTRANSACCION = TRANSACCION.CODIGOTRANSACCION AND FLAGEXTORNO=0;
      END IF;
    END LOOP;
    
    --INICIO BLOQUE UNO
    SELECT NVL(TRANS.FLAGENVIARHOST,0) INTO L_FLAGHOST
    FROM CONNEG.TRANSACCION TRANS
    WHERE TRANS.CODIGOTRANSACCION = 6;
    
    SELECT VALORALFANUMERICO INTO P_CODIGO_OPE_HOST_CHEQUE FROM PARAMETRO WHERE CODIGOPARAMETRO = 5082 AND CODIGOTIPOPARAMETRO = 50;
    
    IF L_FLAGHOST = 1 THEN
      --REGISTRAMOS LOS PAGOS DE CHEQUES PROPIOS DEL BANCO
      INSERT INTO SalidaCuenta(CodigoSecuencial,INTERFACE,NUMERO_FIC,CCC,CENTRO_ORI,USERID_ORI,IMPORTE,DIVISA,OBSERVA,FILLER1,CODIGO,SIGNO_OPER,FILLER2,LOTE_ID,F_ANULA)
      SELECT SQ_SALIDACUENTA.NEXTVAL,
           'HQ' INTERFACE,
           L_NUMERO_FIC  NUMERO_FIC,
           OPE.CODIGOENTIDAD || OPE.CODIGOOFICINA || OPE.NUMEROCUENTA CCC,
           OPE.OFICINAREGISTRO CENTRO_ORI,
           OPE.USUARIOREGISTRO USERID_ORI,
           FN_FORMATO_MONTO_HOST_CI_C(OPE.IMPORTETOTAL)    IMPORTE,
           OPE.CODIGODIVISA                        DIVISA,
           CHQ.OBSERVACIONCHEQUE                   OBSERVA,
           P_CODIGO_OPE_HOST_CHEQUE                FILLER1,
           L_CODIGO_OPE_RET   CODIGO,
           'R' SIGNO_OPER,
           OPE.NUMEROCHEQUE FILLER2,
           P_LOTE_ID,
           OPE.FLAGEXTORNO F_ANULA
      FROM   OPERACIONCHEQUE OPE, CHEQUE CHQ
      WHERE  OPE.CODIGOTRANSACCION = 6
      AND    OPE.CODIGOOPERACION   = CHQ.CODIGOOPERACION
      AND    OPE.FLAGEXTORNO=0;
    END IF;
  END;

  PROCEDURE SP_CARGAR_EXP_TRANSACCION(P_LOTE_ID IN INTEGER)
  IS
    L_CODIGO_OPE_DEP VARCHAR2(100);
    L_CODIGO_OPE_RET VARCHAR2(100);
  BEGIN
  
  BEGIN
    SELECT SUBSTR(VALORALFANUMERICO, 1, 3) INTO L_CODIGO_OPE_DEP FROM PARAMETRO WHERE CODIGOPARAMETRO = 4201;
    SELECT SUBSTR(VALORALFANUMERICO, 1, 3) INTO L_CODIGO_OPE_RET FROM PARAMETRO WHERE CODIGOPARAMETRO = 4202;
  
    EXCEPTION
      WHEN OTHERS THEN
        L_CODIGO_OPE_DEP := '   ';
        L_CODIGO_OPE_RET := '   ';
  END;
  -- INICIO DEPOSITO EFECTIVO
  INSERT INTO SALIDATRANSACCION  (
      SECUENCIAL_ID,
      INDICADORCLIENTE,
      TIPODOCORIGEN,
      NUMERODOCORIGEN,
      NUMEROCONTRATOORIGEN,
      TIPODOCDESTINO,
      NUMERODOCDESTINO,
      NUMEROCONTRATODESTINO,
      INDICADORFORMAPAGO,
      FECHAOPERACION,
      CODIGODIVISA,
      IMPORTEOPERACION,
      INDICADORAPLICACION,
      CODIGOTRANSACCION,
      TIPODOCBENEFICIARIO,
      NUMERODOCBENEFICIARIO,
      NOMBREBENEFICIARIO,
      DIRECCIONBENEFICIARIO,
      NOMBREORDENANTE,
      DIRECCIONORDENANTE,
      TIPODOCORDENANTE,
      NUMERODOCORDENANTE,
      NOMBRESOLICITANTE,
      DIRECCIONSOLICITANTE,
      TIPODOCSOLICITANTE,
      NUMERODOCSOLICITANTE,
      INDICADORPROCEDENCIA,
      INDICADORTIPOCAMBIO,
      INDICADORANULACION,
      NUMEROCHEQUE,
      CODIGOOPERACION,
      DESCRIPCIONREFERENCIA,
      INDICADORDIVISAREAL,
      ENTIDADOPERACION,
      CODIGOCENTRO,
      CODIGOUSUARIO,
      NUMEROTERMINAL,
      HORAACTUAL,
      ENTIDADEMPRESA,
      INDICADORORIGENDINERO,
      NOMBREBCOINTER,
      DIRECCIONBCOINTER,
      NUMERODOCBCOINTER,
      NUMEROCTABCOINTER,
      INDICADOROPCION,
      LOTE_ID,
      USUARIOREGISTRO,
      FECHAREGISTRO,
      USUARIOMODIFICACION,
      FECHAMODIFICACION,
      IMPORTETOTALCEROS
    )
  SELECT
        SQ_SALIDATRANSACCION.NEXTVAL  SECUENCIAL_ID,
        'S'                           INDICADORCLIENTE,
        SIG.TIPO_DOCU_ORDE            TIPODOCORIGEN,
        SIG.NUMERO_DOCU_ORDE          NUMERODOCORIGEN,
        NULL                           NUMEROCONTRATOORIGEN,
        NULL                           TIPODOCDESTINO,
        NULL                           NUMERODOCDESTINO,
        OE.NUMEROCUENTA               NUMEROCONTRATODESTINO,
        'E'                           INDICADORFORMAPAGO,
        TO_CHAR(OE.FECHAREGISTRO,'DD/MM/YYYY') FECHAOPERACION,
        OE.CODIGODIVISA               CODIGODIVISA,
        FN_FORMATO_MONTO_HOST(OE.IMPORTETOTAL)               IMPORTEOPERACION,
  --      'PC'                         INDICADORAPLICACION,
          'HQ'                         INDICADORAPLICACION,
        T.CODIGOTRANSACCIONHOST                        CODIGOTRANSACCION,
        SIG.TIPO_DOCU_BENE            TIPODOCBENEFICIARIO,
        SIG.NUMERO_DOCU_BENE          NUMERODOCBENEFICIARIO,
        SUBSTR(SIG.NOMBRE_BENE,1,50)  NOMBREBENEFICIARIO,
        SUBSTR(SIG.DIRECCION_BENE,1,35) DIRECCIONBENEFICIARIO,
        SUBSTR(SIG.NOMBRE_ORDE,1,50)  NOMBREORDENANTE,
        SUBSTR(SIG.DIRECCION_ORDE,1,35) DIRECCIONORDENANTE,
        SIG.TIPO_DOCU_ORDE            TIPODOCORDENANTE,
        SIG.NUMERO_DOCU_ORDE          NUMERODOCORDENANTE,
        SUBSTR(SIG.NOMBRE_SOLI,1,50)  NOMBRESOLICITANTE,
        SUBSTR(SIG.DIRECCION_SOLI,1,35) DIRECCIONSOLICITANTE,
        SIG.TIPO_DOCU_SOLI            TIPODOCSOLICITANTE,
        SIG.NUMERO_DOCU_SOLI          NUMERODOCSOLICITANTE,
        'B'                           INDICADORPROCEDENCIA,
        NULL                           INDICADORTIPOCAMBIO,
        NULL                           INDICADORANULACION,
        NULL                           NUMEROCHEQUE,
       -- L_CODIGO_OPE /*OE.CODIGOOPERACION*/ CODIGOOPERACION,
        L_CODIGO_OPE_DEP /*OE.CODIGOOPERACION*/ CODIGOOPERACION,
        SUBSTR(OE.DESCRIPCIONOBSERVACION,1,15) DESCRIPCIONREFERENCIA,
        OE.CODIGODIVISA               INDICADORDIVISAREAL,
        '0011'                        ENTIDADOPERACION,
        OE.OFICINAREGISTRO            CODIGOCENTRO,
        OE.USUARIOREGISTRO            CODIGOUSUARIO,
        OE.TERMINALREGISTRO           NUMEROTERMINAL,
        F_HORA_SERVIDOR_HOST(OE.FECHAREGISTRO) HORAACTUAL,
        NULL                           ENTIDADEMPRESA,
        SIG.ORIGEN                    INDICADORORIGENDINERO,
        NULL                           NOMBREBCOINTER,
        NULL                           DIRECCIONBCOINTER,
        NULL                           NUMERODOCBCOINTER,
        NULL                           NUMEROCTABCOINTER,
        NULL                           INDICADOROPCION,
        P_LOTE_ID                               LOTE_ID,
        OE.USUARIOREGISTRO            USUARIOREGISTRO,
        OE.FECHAREGISTRO            FECHAREGISTRO,
        OE.USUARIOMODIFICACION        USUARIOMODIFICACION,
        OE.FECHAMODIFICACION          FECHAMODIFICACION,
        FN_FORMATO_MONTO_HOST_CI(OE.IMPORTETOTAL)  IMPORTETOTALCEROS
        FROM OPERACIONEFECTIVO OE
        INNER JOIN   OPERACION_SIGNIFICATIVA SIG ON (SIG.CODIGOOPERACION = OE.CODIGOOPERACION)
        INNER JOIN TRANSACCION  T ON(T.CODIGOTRANSACCION=OE.CODIGOTRANSACCION)
        WHERE OE.CODIGOTRANSACCION=3
        AND OE.flagextorno=0;
  -- FIN DEPOSITO EFECTIVO
  
  
  -- INICIO RETIRO EFECTIVO
  INSERT INTO SALIDATRANSACCION  (
      SECUENCIAL_ID,
      INDICADORCLIENTE,
      TIPODOCORIGEN,
      NUMERODOCORIGEN,
      NUMEROCONTRATOORIGEN,
      TIPODOCDESTINO,
      NUMERODOCDESTINO,
      NUMEROCONTRATODESTINO,
      INDICADORFORMAPAGO,
      FECHAOPERACION,
      CODIGODIVISA,
      IMPORTEOPERACION,
      INDICADORAPLICACION,
      CODIGOTRANSACCION,
      TIPODOCBENEFICIARIO,
      NUMERODOCBENEFICIARIO,
      NOMBREBENEFICIARIO,
      DIRECCIONBENEFICIARIO,
      NOMBREORDENANTE,
      DIRECCIONORDENANTE,
      TIPODOCORDENANTE,
      NUMERODOCORDENANTE,
      NOMBRESOLICITANTE,
      DIRECCIONSOLICITANTE,
      TIPODOCSOLICITANTE,
      NUMERODOCSOLICITANTE,
      INDICADORPROCEDENCIA,
      INDICADORTIPOCAMBIO,
      INDICADORANULACION,
      NUMEROCHEQUE,
      CODIGOOPERACION,
      DESCRIPCIONREFERENCIA,
      INDICADORDIVISAREAL,
      ENTIDADOPERACION,
      CODIGOCENTRO,
      CODIGOUSUARIO,
      NUMEROTERMINAL,
      HORAACTUAL,
      ENTIDADEMPRESA,
      INDICADORORIGENDINERO,
      NOMBREBCOINTER,
      DIRECCIONBCOINTER,
      NUMERODOCBCOINTER,
      NUMEROCTABCOINTER,
      INDICADOROPCION,
      LOTE_ID,
      USUARIOREGISTRO,
      FECHAREGISTRO,
      USUARIOMODIFICACION,
      FECHAMODIFICACION,
      IMPORTETOTALCEROS
    )
  SELECT
        SQ_SALIDATRANSACCION.NEXTVAL  SECUENCIAL_ID,
        'S'                           INDICADORCLIENTE,
        NULL                           TIPODOCORIGEN,
        NULL                          NUMERODOCORIGEN,
        OE.NUMEROCUENTA               NUMEROCONTRATOORIGEN,
        SIG.TIPO_DOCU_BENE            TIPODOCDESTINO,
        SIG.NUMERO_DOCU_BENE               NUMERODOCDESTINO,
        NULL                           NUMEROCONTRATODESTINO,
        'E'                           INDICADORFORMAPAGO,
        TO_CHAR(OE.FECHAREGISTRO,'DD/MM/YYYY')              FECHAOPERACION,
        OE.CODIGODIVISA               CODIGODIVISA,
        FN_FORMATO_MONTO_HOST(OE.IMPORTETOTAL)               IMPORTEOPERACION,
        --'PC'                         INDICADORAPLICACION,
        'HQ'                         INDICADORAPLICACION,
        T.CODIGOTRANSACCIONHOST                        CODIGOTRANSACCION,
        SIG.TIPO_DOCU_BENE            TIPODOCBENEFICIARIO,
        SIG.NUMERO_DOCU_BENE          NUMERODOCBENEFICIARIO,
        SUBSTR(SIG.NOMBRE_BENE,1,50)    NOMBREBENEFICIARIO,
        SUBSTR(SIG.DIRECCION_BENE,1,35) DIRECCIONBENEFICIARIO,
        SUBSTR(SIG.NOMBRE_ORDE,1,50)    NOMBREORDENANTE,
        SUBSTR(SIG.DIRECCION_ORDE,1,35) DIRECCIONORDENANTE,
        SIG.TIPO_DOCU_ORDE            TIPODOCORDENANTE,
        SIG.NUMERO_DOCU_ORDE          NUMERODOCORDENANTE,
        SUBSTR(SIG.NOMBRE_SOLI,1,50)  NOMBRESOLICITANTE,
        SUBSTR(SIG.DIRECCION_SOLI,1,35) DIRECCIONSOLICITANTE,
        SIG.TIPO_DOCU_SOLI            TIPODOCSOLICITANTE,
        SIG.NUMERO_DOCU_SOLI          NUMERODOCSOLICITANTE,
        'B'                           INDICADORPROCEDENCIA,
        NULL                           INDICADORTIPOCAMBIO,
        NULL                           INDICADORANULACION,
        NULL                           NUMEROCHEQUE,
       --L_CODIGO_OPE               CODIGOOPERACION,
        L_CODIGO_OPE_RET            CODIGOOPERACION,
        SUBSTR(OE.DESCRIPCIONOBSERVACION,1,15) DESCRIPCIONREFERENCIA,
        OE.CODIGODIVISA               INDICADORDIVISAREAL,
        '0011'                        ENTIDADOPERACION,
        OE.OFICINAREGISTRO            CODIGOCENTRO,
        OE.USUARIOREGISTRO            CODIGOUSUARIO,
        OE.TERMINALREGISTRO           NUMEROTERMINAL,
        F_HORA_SERVIDOR_HOST(OE.FECHAREGISTRO)              HORAACTUAL,
        NULL                           ENTIDADEMPRESA,
        SIG.ORIGEN                    INDICADORORIGENDINERO,
        NULL                           NOMBREBCOINTER,
        NULL                           DIRECCIONBCOINTER,
        NULL                           NUMERODOCBCOINTER,
        NULL                           NUMEROCTABCOINTER,
        NULL                           INDICADOROPCION,
        P_LOTE_ID                           LOTE_ID,
        OE.USUARIOREGISTRO            USUARIOREGISTRO,
        OE.FECHAREGISTRO            FECHAREGISTRO,
        OE.USUARIOMODIFICACION        USUARIOMODIFICACION,
        OE.FECHAMODIFICACION          FECHAMODIFICACION,
        FN_FORMATO_MONTO_HOST_CI(OE.IMPORTETOTAL)  IMPORTETOTALCEROS
        FROM OPERACIONEFECTIVO OE
        INNER JOIN   OPERACION_SIGNIFICATIVA SIG ON (SIG.CODIGOOPERACION = OE.CODIGOOPERACION)
        INNER JOIN TRANSACCION  T ON(T.CODIGOTRANSACCION=OE.CODIGOTRANSACCION)
        WHERE OE.CODIGOTRANSACCION='5'
        AND OE.flagextorno=0;
  -- FIN RETIRO EFECTIVO
  
  
  
  -- INICIO PAGO A CUENTA TAJETA DE CREDITO
  INSERT INTO SALIDATRANSACCION  (
      SECUENCIAL_ID,
      INDICADORCLIENTE,
      TIPODOCORIGEN,
      NUMERODOCORIGEN,
      NUMEROCONTRATOORIGEN,
      TIPODOCDESTINO,
      NUMERODOCDESTINO,
      NUMEROCONTRATODESTINO,
      INDICADORFORMAPAGO,
      FECHAOPERACION,
      CODIGODIVISA,
      IMPORTEOPERACION,
      INDICADORAPLICACION,
      CODIGOTRANSACCION,
      TIPODOCBENEFICIARIO,
      NUMERODOCBENEFICIARIO,
      NOMBREBENEFICIARIO,
      DIRECCIONBENEFICIARIO,
      NOMBREORDENANTE,
      DIRECCIONORDENANTE,
      TIPODOCORDENANTE,
      NUMERODOCORDENANTE,
      NOMBRESOLICITANTE,
      DIRECCIONSOLICITANTE,
      TIPODOCSOLICITANTE,
      NUMERODOCSOLICITANTE,
      INDICADORPROCEDENCIA,
      INDICADORTIPOCAMBIO,
      INDICADORANULACION,
      NUMEROCHEQUE,
      CODIGOOPERACION,
      DESCRIPCIONREFERENCIA,
      INDICADORDIVISAREAL,
      ENTIDADOPERACION,
      CODIGOCENTRO,
      CODIGOUSUARIO,
      NUMEROTERMINAL,
      HORAACTUAL,
      ENTIDADEMPRESA,
      INDICADORORIGENDINERO,
      NOMBREBCOINTER,
      DIRECCIONBCOINTER,
      NUMERODOCBCOINTER,
      NUMEROCTABCOINTER,
      INDICADOROPCION,
      LOTE_ID,
      USUARIOREGISTRO,
      FECHAREGISTRO,
      USUARIOMODIFICACION,
      FECHAMODIFICACION,
      IMPORTETOTALCEROS
    )
  SELECT
        SQ_SALIDATRANSACCION.NEXTVAL  SECUENCIAL_ID,
        'S'                           INDICADORCLIENTE,
        SIG.TIPO_DOCU_ORDE            TIPODOCORIGEN,
        SIG.NUMERO_DOCU_ORDE          NUMERODOCORIGEN,
        NULL                           NUMEROCONTRATOORIGEN,
        NULL                           TIPODOCDESTINO,
        NULL                           NUMERODOCDESTINO,
        OE.NUMEROCUENTA               NUMEROCONTRATODESTINO,
        'E'                           INDICADORFORMAPAGO,
        TO_CHAR(OE.FECHAREGISTRO,'DD/MM/YYYY')              FECHAOPERACION,
        OE.CODIGODIVISA               CODIGODIVISA,
        FN_FORMATO_MONTO_HOST(OE.IMPORTETOTAL)               IMPORTEOPERACION,
        --'PC'                         INDICADORAPLICACION,
        'HQ'                         INDICADORAPLICACION,
        T.CODIGOTRANSACCIONHOST                        CODIGOTRANSACCION,
        SIG.TIPO_DOCU_BENE            TIPODOCBENEFICIARIO,
        SIG.NUMERO_DOCU_BENE          NUMERODOCBENEFICIARIO,
        SUBSTR(SIG.NOMBRE_BENE,1,50)    NOMBREBENEFICIARIO,
        SUBSTR(SIG.DIRECCION_BENE,1,35) DIRECCIONBENEFICIARIO,
        SUBSTR(SIG.NOMBRE_ORDE,1,50)    NOMBREORDENANTE,
        SUBSTR(SIG.DIRECCION_ORDE,1,35) DIRECCIONORDENANTE,
        SIG.TIPO_DOCU_ORDE            TIPODOCORDENANTE,
        SIG.NUMERO_DOCU_ORDE          NUMERODOCORDENANTE,
        SUBSTR(SIG.NOMBRE_SOLI,1,50)  NOMBRESOLICITANTE,
        SUBSTR(SIG.DIRECCION_SOLI,1,35) DIRECCIONSOLICITANTE,
        SIG.TIPO_DOCU_SOLI            TIPODOCSOLICITANTE,
        SIG.NUMERO_DOCU_SOLI          NUMERODOCSOLICITANTE,
        'B'                           INDICADORPROCEDENCIA,
        NULL                           INDICADORTIPOCAMBIO,
        NULL                           INDICADORANULACION,
        NULL                           NUMEROCHEQUE,
        --L_CODIGO_OPE            CODIGOOPERACION,
        L_CODIGO_OPE_DEP          CODIGOOPERACION,
        SUBSTR(OE.DESCRIPCIONOBSERVACION,1,15) DESCRIPCIONREFERENCIA,
        OE.CODIGODIVISA               INDICADORDIVISAREAL,
        '0011'                        ENTIDADOPERACION,
        OE.OFICINAREGISTRO            CODIGOCENTRO,
        OE.USUARIOREGISTRO            CODIGOUSUARIO,
        OE.TERMINALREGISTRO           NUMEROTERMINAL,
        F_HORA_SERVIDOR_HOST(OE.FECHAREGISTRO)              HORAACTUAL,
        NULL                           ENTIDADEMPRESA,
        SIG.ORIGEN                    INDICADORORIGENDINERO,
        NULL                           NOMBREBCOINTER,
        NULL                           DIRECCIONBCOINTER,
        NULL                           NUMERODOCBCOINTER,
        NULL                           NUMEROCTABCOINTER,
        NULL                           INDICADOROPCION,
        P_LOTE_ID                     LOTE_ID,
        OE.USUARIOREGISTRO            USUARIOREGISTRO,
        OE.FECHAREGISTRO            FECHAREGISTRO,
        OE.USUARIOMODIFICACION        USUARIOMODIFICACION,
        OE.FECHAMODIFICACION          FECHAMODIFICACION,
         FN_FORMATO_MONTO_HOST_CI(OE.IMPORTETOTAL)  IMPORTETOTALCEROS
        FROM OPERACIONEFECTIVO OE
        INNER JOIN   OPERACION_SIGNIFICATIVA SIG ON (SIG.CODIGOOPERACION = OE.CODIGOOPERACION)
        INNER JOIN TRANSACCION  T ON(T.CODIGOTRANSACCION=OE.CODIGOTRANSACCION)
        WHERE OE.CODIGOTRANSACCION='1'
        AND OE.flagextorno=0;
  -- FIN PAGO A CUENTA TAJETA DE CREDITO
  
  
  -- DEPOSITO CHEQUE
  INSERT INTO SALIDATRANSACCION  (
      SECUENCIAL_ID,
      INDICADORCLIENTE,
      TIPODOCORIGEN,
      NUMERODOCORIGEN,
      NUMEROCONTRATOORIGEN,
      TIPODOCDESTINO,
      NUMERODOCDESTINO,
      NUMEROCONTRATODESTINO,
      INDICADORFORMAPAGO,
      FECHAOPERACION,
      CODIGODIVISA,
      IMPORTEOPERACION,
      INDICADORAPLICACION,
      CODIGOTRANSACCION,
      TIPODOCBENEFICIARIO,
      NUMERODOCBENEFICIARIO,
      NOMBREBENEFICIARIO,
      DIRECCIONBENEFICIARIO,
      NOMBREORDENANTE,
      DIRECCIONORDENANTE,
      TIPODOCORDENANTE,
      NUMERODOCORDENANTE,
      NOMBRESOLICITANTE,
      DIRECCIONSOLICITANTE,
      TIPODOCSOLICITANTE,
      NUMERODOCSOLICITANTE,
      INDICADORPROCEDENCIA,
      INDICADORTIPOCAMBIO,
      INDICADORANULACION,
      NUMEROCHEQUE,
      CODIGOOPERACION,
      DESCRIPCIONREFERENCIA,
      INDICADORDIVISAREAL,
      ENTIDADOPERACION,
      CODIGOCENTRO,
      CODIGOUSUARIO,
      NUMEROTERMINAL,
      HORAACTUAL,
      ENTIDADEMPRESA,
      INDICADORORIGENDINERO,
      NOMBREBCOINTER,
      DIRECCIONBCOINTER,
      NUMERODOCBCOINTER,
      NUMEROCTABCOINTER,
      INDICADOROPCION,
      LOTE_ID,
      USUARIOREGISTRO,
      FECHAREGISTRO,
      USUARIOMODIFICACION,
      FECHAMODIFICACION,
      IMPORTETOTALCEROS
    )
  SELECT
        SQ_SALIDATRANSACCION.NEXTVAL  SECUENCIAL_ID,
        /*CASE WHEN EC.NUMEROCLIENTE IS NULL THEN 'N' ELSE 'S' END INDICADORCLIENTE,*/
        'S'                           INDICADORCLIENTE,
        NULL                          TIPODOCORIGEN,
        NULL                          NUMERODOCORIGEN,
        NULL                          NUMEROCONTRATOORIGEN,
        NULL                          TIPODOCDESTINO,
        NULL                          NUMERODOCDESTINO,
        OC.NUMEROCUENTA               NUMEROCONTRATODESTINO,
        /*SIG.TIPO_DOCU_BENE            TIPODOCDESTINO,
        SIG.NUMERO_DOCU_BENE          NUMERODOCDESTINO,
        NULL               NUMEROCONTRATODESTINO,*/
        'Q'                           INDICADORFORMAPAGO,
        TO_CHAR(OC.FECHAREGISTRO,'DD/MM/YYYY')              FECHAOPERACION,
        OC.CODIGODIVISA               CODIGODIVISA,
        FN_FORMATO_MONTO_HOST(OC.IMPORTETOTAL)               IMPORTEOPERACION,
        --'PC'                          INDICADORAPLICACION,
        'HQ'                          INDICADORAPLICACION,
        T.CODIGOTRANSACCIONHOST                        CODIGOTRANSACCION,
        SIG.TIPO_DOCU_BENE            TIPODOCBENEFICIARIO,
        SIG.NUMERO_DOCU_BENE          NUMERODOCBENEFICIARIO,
        SUBSTR(SIG.NOMBRE_BENE,1,50)               NOMBREBENEFICIARIO,
        SUBSTR(SIG.DIRECCION_BENE,1,35)            DIRECCIONBENEFICIARIO,
        SUBSTR(SIG.NOMBRE_ORDE,1,50)               NOMBREORDENANTE,
        SUBSTR(SIG.DIRECCION_ORDE,1,35)            DIRECCIONORDENANTE,
        SIG.TIPO_DOCU_ORDE            TIPODOCORDENANTE,
        SIG.NUMERO_DOCU_ORDE          NUMERODOCORDENANTE,
        SUBSTR(SIG.NOMBRE_SOLI,1,50)               NOMBRESOLICITANTE,
        SUBSTR(SIG.DIRECCION_SOLI,1,35)            DIRECCIONSOLICITANTE,
        SIG.TIPO_DOCU_SOLI            TIPODOCSOLICITANTE,
        SIG.NUMERO_DOCU_SOLI          NUMERODOCSOLICITANTE,
        'B'                           INDICADORPROCEDENCIA,
        NULL                           INDICADORTIPOCAMBIO,
        NULL                           INDICADORANULACION,
        CH.NUMEROCHEQUE               NUMEROCHEQUE,
        --L_CODIGO_OPE                  CODIGOOPERACION,
        L_CODIGO_OPE_DEP                CODIGOOPERACION,
        NULL                          DESCRIPCIONREFERENCIA,
        OC.CODIGODIVISA               INDICADORDIVISAREAL,
        '0011'                        ENTIDADOPERACION,
        OC.OFICINAREGISTRO            CODIGOCENTRO,
        OC.USUARIOREGISTRO            CODIGOUSUARIO,
        OC.TERMINALREGISTRO           NUMEROTERMINAL,
        F_HORA_SERVIDOR_HOST(OC.FECHAREGISTRO)             HORAACTUAL,
        NULL                           ENTIDADEMPRESA,
        SIG.ORIGEN                    INDICADORORIGENDINERO,
        NULL                           NOMBREBCOINTER,
        NULL                           DIRECCIONBCOINTER,
        NULL                           NUMERODOCBCOINTER,
        NULL                           NUMEROCTABCOINTER,
        NULL                           INDICADOROPCION,
        P_LOTE_ID                     LOTE_ID,
        OC.USUARIOREGISTRO            USUARIOREGISTRO,
        OC.FECHAREGISTRO            FECHAREGISTRO,
        OC.USUARIOMODIFICACION        USUARIOMODIFICACION,
        OC.FECHAMODIFICACION          FECHAMODIFICACION,
        FN_FORMATO_MONTO_HOST_CI(OC.IMPORTETOTAL)  IMPORTETOTALCEROS
        FROM OPERACIONCHEQUE OC
        INNER JOIN   OPERACION_SIGNIFICATIVA SIG ON (SIG.CODIGOOPERACION = OC.CODIGOOPERACION)
        INNER JOIN CHEQUE CH                  ON(CH.CODIGOOPERACION=OC.CODIGOOPERACION)
        LEFT JOIN   ENTRADACLIENTE EC ON(EC.CODIGOIDENTIFICACION=SIG.TIPO_DOCU_BENE AND SIG.NUMERO_DOCU_BENE=EC.NUMEROIDENTIFICACION||NVL(EC.DIGITOIDENTIFICACION,''))
        INNER JOIN TRANSACCION  T ON(T.CODIGOTRANSACCION=OC.CODIGOTRANSACCION)
        WHERE OC.CODIGOTRANSACCION='4'
        AND OC.flagextorno=0;
  -- FIN DEPOSITO CHEQUE
  
  -- PAGO CHEQUE
  INSERT INTO SALIDATRANSACCION  (
      SECUENCIAL_ID,
      INDICADORCLIENTE,
      TIPODOCORIGEN,
      NUMERODOCORIGEN,
      NUMEROCONTRATOORIGEN,
      TIPODOCDESTINO,
      NUMERODOCDESTINO,
      NUMEROCONTRATODESTINO,
      INDICADORFORMAPAGO,
      FECHAOPERACION,
      CODIGODIVISA,
      IMPORTEOPERACION,
      INDICADORAPLICACION,
      CODIGOTRANSACCION,
      TIPODOCBENEFICIARIO,
      NUMERODOCBENEFICIARIO,
      NOMBREBENEFICIARIO,
      DIRECCIONBENEFICIARIO,
      NOMBREORDENANTE,
      DIRECCIONORDENANTE,
      TIPODOCORDENANTE,
      NUMERODOCORDENANTE,
      NOMBRESOLICITANTE,
      DIRECCIONSOLICITANTE,
      TIPODOCSOLICITANTE,
      NUMERODOCSOLICITANTE,
      INDICADORPROCEDENCIA,
      INDICADORTIPOCAMBIO,
      INDICADORANULACION,
      NUMEROCHEQUE,
      CODIGOOPERACION,
      DESCRIPCIONREFERENCIA,
      INDICADORDIVISAREAL,
      ENTIDADOPERACION,
      CODIGOCENTRO,
      CODIGOUSUARIO,
      NUMEROTERMINAL,
      HORAACTUAL,
      ENTIDADEMPRESA,
      INDICADORORIGENDINERO,
      NOMBREBCOINTER,
      DIRECCIONBCOINTER,
      NUMERODOCBCOINTER,
      NUMEROCTABCOINTER,
      INDICADOROPCION,
      LOTE_ID,
      USUARIOREGISTRO,
      FECHAREGISTRO,
      USUARIOMODIFICACION,
      FECHAMODIFICACION,
      IMPORTETOTALCEROS
    )
  SELECT
        SQ_SALIDATRANSACCION.NEXTVAL  SECUENCIAL_ID,
        CASE WHEN EC.NUMEROCLIENTE IS NULL THEN 'N' ELSE 'S' END INDICADORCLIENTE,
        NULL                           TIPODOCORIGEN,
        NULL                           NUMERODOCORIGEN,
        OC.NUMEROCUENTA               NUMEROCONTRATOORIGEN,
        SIG.TIPO_DOCU_BENE            TIPODOCDESTINO,
        SIG.NUMERO_DOCU_BENE          NUMERODOCDESTINO,
        NULL                          NUMEROCONTRATODESTINO,
        'Q'                           INDICADORFORMAPAGO,
        TO_CHAR(OC.FECHAREGISTRO,'DD/MM/YYYY')              FECHAOPERACION,
        OC.CODIGODIVISA               CODIGODIVISA,
        FN_FORMATO_MONTO_HOST(OC.IMPORTETOTAL)               IMPORTEOPERACION,
        --'PC'                          INDICADORAPLICACION,
        'HQ'                          INDICADORAPLICACION,
        T.CODIGOTRANSACCIONHOST                        CODIGOTRANSACCION,
        SIG.TIPO_DOCU_BENE            TIPODOCBENEFICIARIO,
        SIG.NUMERO_DOCU_BENE          NUMERODOCBENEFICIARIO,
        SUBSTR(SIG.NOMBRE_BENE,1,50)               NOMBREBENEFICIARIO,
        SUBSTR(SIG.DIRECCION_BENE,1,35)            DIRECCIONBENEFICIARIO,
        SUBSTR(SIG.NOMBRE_ORDE,1,50)               NOMBREORDENANTE,
        SUBSTR(SIG.DIRECCION_ORDE,1,35)            DIRECCIONORDENANTE,
        SIG.TIPO_DOCU_ORDE            TIPODOCORDENANTE,
        SIG.NUMERO_DOCU_ORDE          NUMERODOCORDENANTE,
        SUBSTR(SIG.NOMBRE_SOLI,1,50)               NOMBRESOLICITANTE,
        SUBSTR(SIG.DIRECCION_SOLI,1,35)            DIRECCIONSOLICITANTE,
        SIG.TIPO_DOCU_SOLI            TIPODOCSOLICITANTE,
        SIG.NUMERO_DOCU_SOLI          NUMERODOCSOLICITANTE,
        'B'                           INDICADORPROCEDENCIA,
        NULL                           INDICADORTIPOCAMBIO,
        NULL                           INDICADORANULACION,
        CH.NUMEROCHEQUE               NUMEROCHEQUE,
        --L_CODIGO_OPE                  CODIGOOPERACION,
        L_CODIGO_OPE_RET                CODIGOOPERACION,
        SUBSTR(CH.OBSERVACIONCHEQUE,1,15)          DESCRIPCIONREFERENCIA,
        OC.CODIGODIVISA               INDICADORDIVISAREAL,
        '0011'                        ENTIDADOPERACION,
        OC.OFICINAREGISTRO            CODIGOCENTRO,
        OC.USUARIOREGISTRO            CODIGOUSUARIO,
        OC.TERMINALREGISTRO           NUMEROTERMINAL,
        F_HORA_SERVIDOR_HOST(OC.FECHAREGISTRO)             HORAACTUAL,
        NULL                           ENTIDADEMPRESA,
        SIG.ORIGEN                    INDICADORORIGENDINERO,
        NULL                           NOMBREBCOINTER,
        NULL                           DIRECCIONBCOINTER,
        NULL                           NUMERODOCBCOINTER,
        NULL                           NUMEROCTABCOINTER,
        NULL                           INDICADOROPCION,
        P_LOTE_ID                     LOTE_ID,
        OC.USUARIOREGISTRO            USUARIOREGISTRO,
        OC.FECHAREGISTRO            FECHAREGISTRO,
        OC.USUARIOMODIFICACION        USUARIOMODIFICACION,
        OC.FECHAMODIFICACION          FECHAMODIFICACION,
        FN_FORMATO_MONTO_HOST_CI(OC.IMPORTETOTAL)  IMPORTETOTALCEROS
        FROM OPERACIONCHEQUE OC
        INNER JOIN   OPERACION_SIGNIFICATIVA SIG ON (SIG.CODIGOOPERACION = OC.CODIGOOPERACION)
        INNER JOIN CHEQUE CH                  ON(CH.CODIGOOPERACION=OC.CODIGOOPERACION)
        LEFT JOIN   ENTRADACLIENTE EC ON(EC.CODIGOIDENTIFICACION=SIG.TIPO_DOCU_BENE
        AND SIG.NUMERO_DOCU_BENE=EC.NUMEROIDENTIFICACION||NVL(EC.DIGITOIDENTIFICACION,''))
        INNER JOIN TRANSACCION  T ON(T.CODIGOTRANSACCION=OC.CODIGOTRANSACCION)
        WHERE OC.CODIGOTRANSACCION='6'
        AND OC.flagextorno=0;
  -- PAGO CHEQUE
  END;

  PROCEDURE SP_CARGAR_EXP_PAGO(P_LOTE_ID IN INTEGER)
  IS
    L_FLAGHOST NUMBER := 0;
  BEGIN
  SELECT NVL(trans.FLAGENVIARHOST,0) INTO L_FLAGHOST
   from conneg.transaccion trans
   where trans.codigotransaccion = G_TRANSACCION_PAGO_CUENTA_TARJ;
  
  IF L_FLAGHOST = 1 THEN
    INSERT INTO SALIDAPAGO (
      SECUENCIAL_ID, BIN_TARJETA, NUMERO_TARJETA, DIVISA, FECHA_PAGO, HORA_PAGO, IMPORTE_PAGO, INDICADOR_ITF,
      MONTO_ITF, IMPORTE_PAGO_TOTAL, OFICINA_PAGO, USUARIO, TERMINAL,
      LOTE_ID,
      USUARIOREGISTRO,
      FECHAREGISTRO,
      USUARIOMODIFICACION,
      FECHAMODIFICACION,
      IMPORTE_PAGO_CEROS,
      MONTO_ITF_CEROS
    )
    SELECT SQ_SALIDAPAGO.NEXTVAL     SECUENCIAL_ID,
           OPE.BINTARJETA    BIN_TARJETA,
           OPE.NUMEROTARJETA NUMERO_TARJETA,
           OPE.CODIGODIVISA  DIVISA,
           TO_CHAR(OPE.FECHAREGISTRO, 'DD-MM-YYYY') FECHA_PAGO,
           TO_CHAR(OPE.FECHAREGISTRO, 'HH24:MI:SS') HORA_PAGO,
           ope.importeingresado PAGO_TARJETA,
          -- FN_FORMATO_MONTO_HOST((OPE.IMPORTETOTAL - OPE.ITF)) PAGO_TARJETA,
           ' ' INDICADOR_ITF,
           --FN_INDICADOR_ITF(ope.importeingresado, ope.importe) INDICADOR_ITF,--16CARAC
           FN_FORMATO_MONTO_HOST(OPE.ITF) ITF,
           OPE.IMPORTETOTAL,
           OPE.OFICINAREGISTRO,
           USUARIOREGISTRO,
           TERMINALREGISTRO,
           P_LOTE_ID,
           USER,
           SYSDATE,
           USER,
           SYSDATE,
           FN_FORMATO_MONTO_HOST_CI(OPE.IMPORTEINGRESADO)   IMPORTE_PAGO_CEROS,
           FN_INDICADOR_ITF(ope.importeingresado, ope.importe) MONTO_ITF_CEROS
           --FN_FORMATO_MONTO_HOST_CI(OPE.ITF) MONTO_ITF_CEROS
    FROM   OPERACIONEFECTIVO OPE
    WHERE  OPE.CODIGOTRANSACCION = G_TRANSACCION_PAGO_CUENTA_TARJ AND OPE.FLAGEXTORNO = 0;
    COMMIT;
  
  END IF;
  END;

  PROCEDURE SP_CARGAR_EXP_BLOQUEO(P_LOTE_ID IN INTEGER)
  IS
    L_FLAGHOST NUMBER := 0;
  BEGIN
  
  SELECT NVL(trans.FLAGENVIARHOST,0) INTO L_FLAGHOST
   from conneg.transaccion trans
   where trans.codigotransaccion = G_TRANSACCION_TARJETA_BLOQUEO;
  
  IF L_FLAGHOST = 1 THEN
  --EXPORTACION DE TARJETAS BLOQUEADAS
  INSERT INTO SalidaBloqueo (SECUENCIAL_ID,ENTIDAD_CONTRATO,OFICINA_CONTRATO,TIPO_CONTRATO,NUMERO_CONTRATO,BIN_TARJETA,NUMERO_TARJETA,TIPO_TARJETA,SITUACION_TARJETA,TIPO_DOCUMENTO,NUMERO_DOCUMENTO,NOMBRES,INDICADOR_REPOSICION,ACCION,MOTIVO,INDICADOR_ENVIO,OFICINA_ENVIO,QUIEN_REPORTA,DESCRIPCION,NUMERO_BLOQUEO,CLAVE_NOTIFICACION,FECHA_BLOQUEO,HORA_BLOQUEO,USUARIO,TERMINAL,LOTE_ID)
  SELECT SQ_SALIDABLOQUEO.NEXTVAL SECUENCIAL_ID,
         BLO.ENTIDADCONTRATO       ENTIDAD_CONTRATO,
         BLO.OFICINACONTRATO       OFICINA_CONTRATO,
         BLO.TIPOCONTRATO          TIPO_CONTRATO,
         BLO.NUMEROCONTRATO        NUMERO_CONTRATO,
         BLO.CODIGOBIN             BIN_TARJETA,
         BLO.NUMEROTARJETA         NUMERO_TARJETA,
         BLO.TIPOTARJETA           TIPO_TARJETA,
         BLO.SITUACIONTARJETA       SITUACION_TARJETA,
         BLO.CODIGOIDENTIFICACION  TIPO_DOCUMENTO,
        -- BLO.NUMEROIDENTIFICACION  NUMERO_DOCUMENTO,
        SUBSTR(BLO.NUMEROIDENTIFICACION,1,10)  NUMERO_DOCUMENTO,
         BLO.TITULAR               NOMBRES,
         BLO.FLAGREPOSICION        INDICADOR_REPOSICION,
         BLO.NOMBREACCION          ACCION,
         BLO.NOMBREMOTIVO          MOTIVO,
         0                         INDICADOR_ENVIO,
         --BLO.FLAGOFICINA           OFICINA_ENVIO,
         --BLO.CODIGOOFICINA         OFICINA_ENVIO,
         BLO.OFICINA_ID               OFICINA_ENVIO,
         BLO.DESCRIPCIONQUIENREPORTA QUIEN_REPORTA,
         BLO.DESCRIPCIONBLOQUEO    DESCRIPCION,
         BLO.NUMERO_BLOQUEO        NUMERO_BLOQUEO,
         SUBSTR(BLO.DESCRIPCIONCLAVE,1,10)      CLAVE_NOTIFICACION,
         TO_CHAR(BLO.FECHAREGISTRO, 'YYYY-MM-DD') FECHA_BLOQUEO,
         TO_CHAR(BLO.FECHAREGISTRO, 'HH24:MM:SS')   HORA_BLOQUEO,
         BLO.USUARIOREGISTRO       USUARIO,
         BLO.TERMINAL_ID           TERMINAL,
         P_LOTE_ID
  FROM   OPERACIONBLOQUEO BLO
  INNER JOIN ENTRADATARJETA ET ON(BLO.CODIGOOPERACION=ET.OPERACION_BLOQUEO);
  COMMIT;
  END IF;
  END;

  PROCEDURE SP_EXPORTACION_CARGAR (P_ESTADO_ID OUT INTEGER, P_ARCHIVO OUT SYS_REFCURSOR)
  IS
    L_ENVIO_ID  INTEGER;
  BEGIN
  
    SELECT MAX(ENV.ENVIO_ID) INTO L_ENVIO_ID FROM ENVIO_HOST ENV;
  
    IF L_ENVIO_ID IS NULL THEN
      P_ESTADO_ID := 601;
    ELSE
      SELECT ENV.ESTADO_ID INTO P_ESTADO_ID FROM ENVIO_HOST ENV WHERE ENV.ENVIO_ID = L_ENVIO_ID;
    END IF;
  
    OPEN P_ARCHIVO
    FOR
    SELECT PRO.NOMBRE        NOMBRE_PROCESO,
           TO_CHAR(ARC.FECHAINICIO, 'DD/MM/YYYY HH24:MI:SS')   FECHA_INI,
           TO_CHAR(ARC.FECHAFIN, 'DD/MM/YYYY HH24:MI:SS')      FECHA_FIN,
           TO_CHAR((ARC.FECHAFIN - ARC.FECHAINICIO)/(24*60),'9999999') DURACION,
           ARC.NOMBREARCHIVO NOMBRE_ARCHIVO,
           ARC.DESCRIPCION   ESTADO_ARCHIVO,
           ARC.CANTIDADREGISTROS LINEAS_ARCHIVO
    FROM   (
            SELECT ARC.TIPO_PROCESO_ID, PAR.DESCRIPCION NOMBRE FROM ARCHIVO ARC, PARAMETRO PAR
            WHERE  PAR.CODIGOTIPOPARAMETRO = 35
            AND    ARC.TIPO_PROCESO_ID = PAR.CODIGOPARAMETRO
            AND    ARC.TIPOARCHIVO = 2
           ) PRO
           LEFT JOIN
           (
           SELECT ARC.TIPO_PROCESO_ID, LAR.FECHAINICIO, LAR.FECHAFIN, LAR.NOMBREARCHIVO, PAR.DESCRIPCION, LAR.CANTIDADREGISTROS
           FROM   ENVIO_HOST_LOTE EHL, LOTEARCHIVO LAR, ARCHIVO ARC, PARAMETRO PAR
           WHERE  EHL.ENVIO_ID        = L_ENVIO_ID
           AND    EHL.LOTE_ID         = LAR.IDLOTE
           AND    ARC.CODIGOARCHIVO   = LAR.CODIGOARCHIVO
           AND    PAR.CODIGOTIPOPARAMETRO = 13
           AND    PAR.VALORNUMERICO       = LAR.ESTADO
           ) ARC ON  PRO.TIPO_PROCESO_ID = ARC.TIPO_PROCESO_ID;
  END;

  PROCEDURE SP_EXPORTACION_GRABAR(P_USUARIO IN VARCHAR2, P_ERROR OUT VARCHAR2)
  IS
    L_ENVIO_ID INTEGER;
    L_LOTE_ID  INTEGER;
    L_ESTADO   INTEGER;
    L_INICIO_APLICACION_ID INTEGER;
  BEGIN
  
    --1.- VALIDAMOS EL ESTADO DE LA APLICACION
    --1.1.- OBTENEMOS EL ID DEL ULTIMO INICIO DE APLICACION
    SELECT MAX(CODIGOINICIO) INTO L_INICIO_APLICACION_ID FROM INICIOAPLICACION;
    --1.2.- SI NO SE HA REGISTRADO ALGUN INICIO
    IF L_INICIO_APLICACION_ID = NULL THEN
      P_ERROR := 'No existe algún registro del inicio de la aplicación';
      RETURN;
    END IF;
    --1.3.- SI EL ESTADO ES DIFERENTE QUE EL TERMINADO
    SELECT FLAGESTADO INTO L_ESTADO FROM INICIOAPLICACION WHERE CODIGOINICIO = L_INICIO_APLICACION_ID;
    IF L_ESTADO NOT IN (2,3) THEN
      P_ERROR := 'La aplicación no ha sido terminada';
      RETURN;
    END IF;
  
    --2.- REALIZAMOS LA EXPORTACIÓN DE DATOS
    UPDATE INICIOAPLICACION
    SET    FECHAEXPORTACION   = SYSDATE,
           USUARIOEXPORTACION = P_USUARIO,
           FLAGESTADO         = 3
    WHERE  CODIGOINICIO       = L_INICIO_APLICACION_ID;
  
    SELECT SQ_ENVIOHOST.NEXTVAL INTO L_ENVIO_ID FROM DUAL;
  
    INSERT INTO ENVIO_HOST (ENVIO_ID,FECHA_INI,ESTADO_ID,USUARIO_CREACION,FECHA_CREACION)
    VALUES (L_ENVIO_ID, SYSDATE, 602, P_USUARIO, SYSDATE);
  
    COMMIT;
  
    FOR PROCESO IN (
      SELECT 11 ARCHIVO_ID FROM DUAL UNION
      SELECT 12 ARCHIVO_ID FROM DUAL UNION
      SELECT 13 ARCHIVO_ID FROM DUAL UNION
      SELECT 14 ARCHIVO_ID FROM DUAL
    )
    LOOP
      BEGIN
      L_LOTE_ID := NULL;
  
      P_GENERAR_ARCHIVO(PROCESO.ARCHIVO_ID, L_LOTE_ID);--14
  
      EXCEPTION
      WHEN OTHERS THEN
        NULL;
      END;
  
      --insert into conneg.testmane (dato1) values(L_LOTE_ID);
  
      IF L_LOTE_ID IS NOT NULL THEN
        INSERT INTO ENVIO_HOST_LOTE (ENVIO_ID,LOTE_ID,USUARIO_CREACION,FECHA_CREACION,USUARIO_MODIFICACION,FECHA_MODIFICACION)
        VALUES (L_ENVIO_ID,L_LOTE_ID,P_USUARIO,SYSDATE,P_USUARIO,SYSDATE);
      END IF;
    END LOOP;
  
    UPDATE ENVIO_HOST
    SET    FECHA_FIN            = SYSDATE,
           ESTADO_ID            = 603,
           USUARIO_MODIFICACION = P_USUARIO,
           FECHA_CREACION       = SYSDATE
    WHERE  ENVIO_ID             = L_ENVIO_ID;
  
    COMMIT;
  END;

  PROCEDURE SP_VERIFICAR_INICIO_APP(P_RESULTADO OUT VARCHAR2, P_ERROR OUT VARCHAR2)
  IS
    L_INICIO_APLICACION_ID NUMBER(16);
    L_ACTIVO NUMBER(5);
    L_FLAG_PARAMETRO VARCHAR2(100):='0';
  BEGIN
    P_ERROR := 'SIN ERROR';
    P_RESULTADO := '0';
    --OBTENEMOS EL ID DEL ULTIMO INICIO DE APLICACION
    SELECT MAX(CODIGOINICIO) INTO L_INICIO_APLICACION_ID
    FROM INICIOAPLICACION;
  
    --OBTENEMOS EL ESTADO DEL INICIO DE LA APLICACION
    IF L_INICIO_APLICACION_ID IS NOT NULL THEN
      SELECT FLAGACTIVO INTO L_ACTIVO FROM INICIOAPLICACION
      WHERE  CODIGOINICIO = L_INICIO_APLICACION_ID;
    END IF;
    -- OBTENEMOS FLAG DE CONFIGURACION
    BEGIN
      SELECT NVL(P.VALORALFANUMERICO,'0') into L_FLAG_PARAMETRO FROM PARAMETRO P
      WHERE P.CODIGOTIPOPARAMETRO = 47
      AND ROWNUM = 1;
    EXCEPTION WHEN OTHERS THEN
        L_FLAG_PARAMETRO := '0';
    END;
  
    --SI EL ESTADO ES ACTIVO
    IF L_ACTIVO = 1 AND L_FLAG_PARAMETRO = '1'THEN
      P_RESULTADO := '1';
    ELSE
      P_RESULTADO := '0';
    END IF;
  EXCEPTION
    WHEN OTHERS THEN
      P_RESULTADO := '-1';
      P_ERROR := SUBSTR(SQLERRM,1,100);
  END;

  PROCEDURE SP_DATOS_CORREO_ARCHIVOS(
  P_CODIGO_ARCHIVO  INTEGER,
  P_NOMBRE_ARCHIVO  OUT VARCHAR2,
  P_RESULTADO_CARGA OUT VARCHAR2,
  P_FEC_HORA_INICIO OUT DATE,
  P_FEC_HORA_FIN    OUT DATE,
  P_CORREO          OUT VARCHAR2
  )
  IS
  
  BEGIN
      SELECT A.CORREOELECTRONICO INTO P_CORREO
      FROM   ARCHIVO A
      WHERE  CODIGOARCHIVO = P_CODIGO_ARCHIVO;
  
      SELECT NOMBREARCHIVO,ESTADO,FECHAINICIO,FECHAFIN
      INTO   P_NOMBRE_ARCHIVO,P_RESULTADO_CARGA,P_FEC_HORA_INICIO,P_FEC_HORA_FIN
      FROM   LOTEARCHIVO
      WHERE  CODIGOARCHIVO=P_CODIGO_ARCHIVO
      AND IDLOTE=(SELECT MAX(IDLOTE) FROM LOTEARCHIVO WHERE CODIGOARCHIVO=P_CODIGO_ARCHIVO )
      group by NOMBREARCHIVO, ESTADO, FECHAINICIO, FECHAFIN ;
  
      IF P_RESULTADO_CARGA = '2' THEN
        P_RESULTADO_CARGA := 'EXITOSO';
      ELSE
        P_RESULTADO_CARGA := 'ERRADO';
      END IF;
  END;

  FUNCTION F_HORA_SERVIDOR_HOST(P_FECHA DATE)RETURN VARCHAR2
  IS
  P_FECHA_SALIDA VARCHAR2(26);
  BEGIN
    --SELECT TO_CHAR(P_FECHA,'YYYY-MM-DD HH24.MI.SS.FFFF') INTO P_FECHA_SALIDA  FROM DUAL;
    SELECT TO_CHAR(P_FECHA,'YYYY-MM-DD-HH24.MI.SS.')||'000000' INTO P_FECHA_SALIDA  FROM DUAL;
    RETURN P_FECHA_SALIDA;
  END;

  FUNCTION FN_FORMATO_MONTO_HOST(P_NUMERO NUMBER)
    RETURN VARCHAR2
  IS
  BEGIN
    RETURN REPLACE(''||TRIM(TO_CHAR(P_NUMERO, '999999999999990.99')),'.','');
  END;

  FUNCTION FN_FORMATO_MONTO_HOST_CI(P_NUMERO NUMBER)
    RETURN VARCHAR2
  IS
  P_NUMERO_CASTING VARCHAR2(14);
  P_NUMERO_CEROS VARCHAR2(17);
  BEGIN
    P_NUMERO_CASTING :=  REPLACE(''||TRIM(TO_CHAR(P_NUMERO, '999999999999990.99')),'.','');
    P_NUMERO_CEROS :=  LPAD(P_NUMERO_CASTING,17,0);
    RETURN P_NUMERO_CEROS;
  END;

  FUNCTION FN_FORMATO_MONTO_HOST_CI_C(P_NUMERO NUMBER)
    RETURN VARCHAR2
  IS
  P_NUMERO_CASTING VARCHAR2(14);
  P_NUMERO_CEROS VARCHAR2(17);
  BEGIN
    P_NUMERO_CASTING :=  REPLACE(''||TRIM(TO_CHAR(P_NUMERO, '999999999999990.99')),'.','');
    P_NUMERO_CEROS :=  LPAD(P_NUMERO_CASTING,15,0);
    RETURN P_NUMERO_CEROS;
  END;

  FUNCTION FN_INDICADOR_ITF(P_NUMERO1 NVARCHAR2,P_NUMERO2 NVARCHAR2 )
    RETURN NVARCHAR2
  IS
    P_NUMERO NVARCHAR2(17);
  BEGIN
      IF TRIM(P_NUMERO1) = TRIM(P_NUMERO2)  THEN
        P_NUMERO := '00000000000000000';
      ELSE
          P_NUMERO := '00000000000000001';
      END IF;
  
      RETURN P_NUMERO;
  END;

  FUNCTION FN_OPERACION_HOST(P_NUMERO NUMBER)
    RETURN NVARCHAR2
  IS
   P_CODIGO_OPE_HOST NVARCHAR2(3);
  BEGIN
    IF TRIM(P_NUMERO) = 3 THEN  -- DEPOSITO
      SELECT VALORALFANUMERICO INTO P_CODIGO_OPE_HOST FROM PARAMETRO WHERE CODIGOPARAMETRO = 5080 AND CODIGOTIPOPARAMETRO = 50;
    ELSE
      SELECT VALORALFANUMERICO INTO P_CODIGO_OPE_HOST FROM PARAMETRO WHERE CODIGOPARAMETRO = 5081 AND CODIGOTIPOPARAMETRO = 50;
    END IF;
    RETURN P_CODIGO_OPE_HOST;
  END;

  FUNCTION FN_OPERACION_CODIGO(P_NUMERO NUMBER)
    RETURN NVARCHAR2
  IS
   P_CODIGO_OPE NVARCHAR2(3);
  BEGIN
    IF TRIM(P_NUMERO) = 3 THEN  -- DEPOSITO
      SELECT VALORALFANUMERICO INTO P_CODIGO_OPE FROM PARAMETRO WHERE CODIGOPARAMETRO = 4201 AND CODIGOTIPOPARAMETRO = 42;
    ELSE
      SELECT VALORALFANUMERICO INTO P_CODIGO_OPE FROM PARAMETRO WHERE CODIGOPARAMETRO = 4202 AND CODIGOTIPOPARAMETRO = 42;
  
    END IF;
    RETURN P_CODIGO_OPE;
  END;

  FUNCTION FN_EXISTE_ARCHIVO_HOST_DIARIO(P_ID_ARCHIVO NUMBER)
    RETURN BOOLEAN
  IS
  lb_file_exist boolean;
  ln_size number;
  ln_block_size number;
  LC_RUTA_ARCHIVO    VARCHAR2(2000);
  LC_NOM_ARCHIVO     VARCHAR2(2000);
  begin
      SELECT NOMBREARCHIVO || TO_CHAR(SYSDATE, 'yymmdd') || '.' ||
             EXTENSION,
             RUTASALIDA
             INTO
             LC_NOM_ARCHIVO, LC_RUTA_ARCHIVO
      FROM ARCHIVO
      WHERE CODIGOARCHIVO = P_ID_ARCHIVO;
      
      sys.utl_file.fgetattr(LC_RUTA_ARCHIVO,LC_NOM_ARCHIVO,lb_file_exist,ln_size,ln_block_size);
  
      IF lb_file_exist THEN
        RETURN TRUE;
      END IF;
    RETURN FALSE;
  end;

  --MODIFICAR PROCEDURE EN PQ_ARCHIVO Body
  PROCEDURE P_AUTOGENERAR_ARCHIVOS_HOST(P_PROG_ARCHIVO VARCHAR, P_EXITO OUT NUMBER) IS
    LC_RUTA_ARCHIVO    VARCHAR2(2000);
    LC_NOM_ARCHIVO     VARCHAR2(2000);
    LC_PROG_ARCHIVO VARCHAR2(10);
    LB_ARCHIVO_ABIERTO BOOLEAN DEFAULT FALSE;
    ARCHIVO            UTL_FILE.FILE_TYPE;
  BEGIN
  
    FOR PROCESO IN (
      SELECT 11 ARCHIVO_ID FROM DUAL UNION
      SELECT 12 ARCHIVO_ID FROM DUAL UNION
      SELECT 13 ARCHIVO_ID FROM DUAL UNION
      SELECT 14 ARCHIVO_ID FROM DUAL
    )
    LOOP
      --dbms_output.put_line(PROCESO.ARCHIVO_ID);
      IF NOT FN_EXISTE_ARCHIVO_HOST_DIARIO(PROCESO.ARCHIVO_ID) then
        SELECT NOMBREARCHIVO || TO_CHAR(SYSDATE, 'yymmdd') || '.' ||EXTENSION,
             RUTASALIDA
             INTO
             LC_NOM_ARCHIVO, LC_RUTA_ARCHIVO
        FROM ARCHIVO
        WHERE CODIGOARCHIVO = PROCESO.ARCHIVO_ID;
        
        SELECT  PROGRAMACION_HORA || PROGRAMACION_MINUTO INTO LC_PROG_ARCHIVO
        FROM ARCHIVO
        WHERE 
        NOMBREARCHIVO = 'CRONTRIGGER';
    
        IF NOT LB_ARCHIVO_ABIERTO AND LC_PROG_ARCHIVO = P_PROG_ARCHIVO THEN
            --dbms_output.put_line(LC_NOM_ARCHIVO);
            ARCHIVO            := UTL_FILE.FOPEN(LC_RUTA_ARCHIVO,LC_NOM_ARCHIVO,'w');
            LB_ARCHIVO_ABIERTO := TRUE;
        END IF;
    
        IF LB_ARCHIVO_ABIERTO THEN 
          UTL_FILE.FCLOSE(ARCHIVO);
          LB_ARCHIVO_ABIERTO := FALSE;
          --dbms_output.put_line(LC_NOM_ARCHIVO || ' CERRADO');
        END IF;
      end if;
    END LOOP;
    P_EXITO:=1;
  END P_AUTOGENERAR_ARCHIVOS_HOST;
  
  /*****************************************************************************
   * Procedimientos optimizados para la carga.                                 *
   *****************************************************************************/
  
  FUNCTION  FN_REGISTRAR_EJECUCION(P_ARCHIVO_ID NUMBER) RETURN NUMBER
  IS
    P_CAPTURA   NUMBER(10) := 0;
    L_FECHA_ID  VARCHAR2(25);
    L_TABLA     VARCHAR2(25);
    L_EXISTE    NUMBER(10) := 0;
  BEGIN
    --OBTENEMOS EL ID DE LA FECHA
    SELECT TO_CHAR(SYSDATE,'YYYYMMDD') || ARC.PROGRAMACION_HORA || ARC.PROGRAMACION_MINUTO, ARC.TABLA INTO L_FECHA_ID, L_TABLA
    FROM   ARCHIVO ARC
    WHERE  ARC.CODIGOARCHIVO = P_ARCHIVO_ID;
    
    --VERIFICAMOS SI EL PROCESO YA FUE EJECUTADO
    SELECT COUNT(1) INTO L_EXISTE FROM ARCHIVO_EJECUCION
    WHERE  FECHA_ID   = L_FECHA_ID
    AND    ARCHIVO_ID = P_ARCHIVO_ID;
    
    --SI EL PROCESO NO FUE EJECUTADO
    IF L_EXISTE = 0 THEN
      P_CAPTURA := 1;
      INSERT INTO ARCHIVO_EJECUCION(FECHA_ID, ARCHIVO_ID, USUARIO_CREACION, FECHA_CREACION)
      VALUES(L_FECHA_ID, P_ARCHIVO_ID, USER, SYSDATE);
      COMMIT;
    END IF;
    
    RETURN P_CAPTURA;
  END FN_REGISTRAR_EJECUCION;
  
  PROCEDURE SP_LIMPIAR_LOG_ERROR (P_ARCHIVO_ID NUMBER, P_IDLOTE NUMBER) AS
  BEGIN
    DELETE FROM ERROR_PROCESO_TEMP WHERE CODIGO_ARCHIVO = P_ARCHIVO_ID AND ID_LOTE = P_IDLOTE;
    COMMIT;
  END SP_LIMPIAR_LOG_ERROR;
  
  PROCEDURE SP_ARCHIVOS_CARGA (P_ARCHIVO OUT SYS_REFCURSOR) AS
  BEGIN
    OPEN P_ARCHIVO FOR
    SELECT ARC.CODIGOARCHIVO ARCHIVO_ID, PROC_LLENADO, TABLA, NOMBREARCHIVO, EXTENSION, RUTAENTRADA --PROGRAMACION_TIPO, PROGRAMACION_MES, PROGRAMACION_DIA
    FROM   CONNEG.ARCHIVO ARC
    WHERE  ARC.FLAGACTIVO = 1
    AND    LENGTH(ARC.PROC_LLENADO) > 0
    AND    ARC.PROGRAMACION_HORA || ARC.PROGRAMACION_MINUTO = TO_CHAR(SYSDATE, 'HH24MI') --HORA Y MINUTO
    AND    NVL(PROGRAMACION_MES, TO_CHAR(SYSDATE, 'MM'))    = TO_CHAR(SYSDATE, 'MM')     --MES (SI ES NULO ES CUALQUIER MES)
    AND    (CASE
            WHEN PROGRAMACION_DIA IS NULL THEN 1                                               --CUALQUIER DIA
            WHEN PROGRAMACION_TIPO = '01' AND PROGRAMACION_DIA = TO_CHAR(SYSDATE, 'DD') THEN 1 --1 DIA DEL MES
            WHEN PROGRAMACION_TIPO = '02' AND PROGRAMACION_DIA = TO_CHAR(SYSDATE, 'D')  THEN 1 --1 DIA DE LA SEMANA
            ELSE 0 END) = 1;
  END;
  
  PROCEDURE SP_REGISTRAR_ERROR (P_IDLOTE NUMBER, P_CODIGOARCHVO NUMBER, P_MENSAJE VARCHAR2) AS
  BEGIN
    INSERT INTO ERROR_PROCESO_TEMP (ID_LOTE, CODIGO_ARCHIVO, MENSAJE_ERROR, FECHA_ERROR)
    VALUES(P_IDLOTE, P_CODIGOARCHVO, P_MENSAJE, SYSDATE);
  END SP_REGISTRAR_ERROR;
  
  PROCEDURE SP_ALTER_CHARACTER_SESSION AS
  BEGIN
    EXECUTE IMMEDIATE('ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ''.,''');
  END SP_ALTER_CHARACTER_SESSION;
  
  PROCEDURE SP_VERIFICAR_ARCHIVO(P_TABLA VARCHAR2, P_EXISTE OUT NUMBER, P_LOG OUT VARCHAR2) AS
    CONSULTA VARCHAR2(2000) := '';
  BEGIN
    P_EXISTE := 0;
    CONSULTA := 'SELECT COUNT(1) FROM (SELECT * FROM CONNEG.' || P_TABLA || ' WHERE ROWNUM = 1) A';

    EXECUTE IMMEDIATE CONSULTA INTO P_EXISTE;
  EXCEPTION
  WHEN OTHERS THEN
    P_EXISTE := -1;
    P_LOG := SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
  END SP_VERIFICAR_ARCHIVO;
  
  
  PROCEDURE SP_CARGAR_ENTRADACHEQUE (P_ARCHIVO_ID INTEGER, P_NOMBRE_ARCHIVO VARCHAR2, P_CAPTURA OUT INTEGER, P_ERROR OUT SYS_REFCURSOR) IS
    V_ERROR             VARCHAR2(2000) := '';
    V_IDLOTE            NUMBER := 0;
    V_LOTEARCHIVO       LOTEARCHIVO%ROWTYPE;
    V_LINEAS            NUMBER := 0;
    V_LINEAS_CORRECTAS  NUMBER := 0;
    V_LINEAS_CON_ERROR  NUMBER := 0;
    V_NUMERO_ERRORES    NUMBER := 0;
    V_EJECUTADO         NUMBER := 0;
    V_ENTRADACHEQUE T_ENTRADACHEQUE;
    V_CURSOR            SYS_REFCURSOR;
    DML_ERRORS          EXCEPTION;
    PRAGMA EXCEPTION_INIT (DML_ERRORS, -24381);
  BEGIN
    P_CAPTURA := 0;
    
    V_LOTEARCHIVO.IDLOTE            := 0;
    V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
    V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
    V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
    
    V_EJECUTADO := FN_REGISTRAR_EJECUCION(P_ARCHIVO_ID);
    
    IF V_EJECUTADO = 1 THEN
      V_IDLOTE := P_REGISTRAR_LOTEARCHIVO(P_ARCHIVO_ID, P_NOMBRE_ARCHIVO);
      V_LOTEARCHIVO.IDLOTE := V_IDLOTE; P_CAPTURA := V_IDLOTE;
      SP_ALTER_CHARACTER_SESSION;
      
      
      SP_VERIFICAR_ARCHIVO('ENTRADACHEQUE_EXT', V_LINEAS, V_ERROR);
      IF V_LINEAS = 1 THEN -- Verifica si existe el archivo
        
        OPEN V_CURSOR FOR SELECT * FROM ENTRADACHEQUE_EXT;
        LOOP
          FETCH V_CURSOR BULK COLLECT INTO V_ENTRADACHEQUE LIMIT 500;
          EXIT WHEN V_ENTRADACHEQUE.NUMERO_LINEA.COUNT = 0;
          
          BEGIN
            FORALL I IN 1 .. V_ENTRADACHEQUE.NUMERO_LINEA.COUNT SAVE EXCEPTIONS
              INSERT INTO ENTRADACHEQUE(
                  CODIGOSECUENCIAL
                , INDICADORNUEVO
                , CODIGOENTIDAD
                , CODIGOCENTRO
                , NUMEROCUENTA
                , NUMEROCHEQUE
                , INDICADORCLASECHQ
                , SALDOCHEQUE
                , FECHAPAGO
                , FECHAGIRO
                , CODIGOENTIDADPAGO
                , CODIGOOFICINAPAGO
                , INDICADORESTADO
                , INDICADORESTADOANT
                , CODIGOENTIDADCHQ
                , CODIGOCENTROCHQ
                , USUARIOREGISTRO
                , FECHAREGISTRO
                , IDLOTE
              ) VALUES  (
                  SQ_ENTRADACHEQUE.NEXTVAL
                , V_ENTRADACHEQUE.INDICADORNUEVO(I)
                , V_ENTRADACHEQUE.CODIGOENTIDAD(I)
                , V_ENTRADACHEQUE.CODIGOCENTRO(I)
                , V_ENTRADACHEQUE.NUMEROCUENTA(I)
                , V_ENTRADACHEQUE.NUMEROCHEQUE(I)
                , V_ENTRADACHEQUE.INDICADORCLASECHQ(I)
                , V_ENTRADACHEQUE.SALDOCHEQUE(I)
                , V_ENTRADACHEQUE.FECHAPAGO(I)
                , V_ENTRADACHEQUE.FECHAGIRO(I)
                , V_ENTRADACHEQUE.CODIGOENTIDADPAGO(I)
                , V_ENTRADACHEQUE.CODIGOOFICINAPAGO(I)
                , V_ENTRADACHEQUE.INDICADORESTADO(I)
                , V_ENTRADACHEQUE.INDICADORESTADOANT(I)
                , V_ENTRADACHEQUE.CODIGOENTIDADCHQ(I)
                , V_ENTRADACHEQUE.CODIGOCENTROCHQ(I)
                , USER
                , SYSDATE
                , V_IDLOTE
              );
            EXCEPTION
              WHEN DML_ERRORS THEN
                V_NUMERO_ERRORES := SQL%BULK_EXCEPTIONS.COUNT;
                FOR IDX IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
                LOOP
                  V_ERROR := 'OCURRIO UN ERROR EN LA LINEA [' || V_ENTRADACHEQUE.NUMERO_LINEA(SQL%BULK_EXCEPTIONS(IDX).ERROR_INDEX) || '] ' || SQLERRM(-SQL%BULK_EXCEPTIONS(IDX).ERROR_CODE);
                  V_LINEAS_CON_ERROR := V_LINEAS_CON_ERROR + 1;
                  SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, V_ERROR);
                END LOOP;
          END;
          
          IF V_NUMERO_ERRORES = 0 THEN
            V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + V_ENTRADACHEQUE.NUMERO_LINEA.COUNT;
          ELSE 
            IF (V_ENTRADACHEQUE.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES) > 0 THEN
              V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + (V_ENTRADACHEQUE.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES);
            END IF;
          END IF;
          
          V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
          V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ENPROCESO;
          
          P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
          COMMIT;
          
          V_NUMERO_ERRORES := 0;
        END LOOP;
        
        CLOSE V_CURSOR;
        COMMIT;
        DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
                
        V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
        V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
        
        IF V_LINEAS_CON_ERROR > 0 THEN
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_ERRARDO;
        ELSE
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_TERMINADO;
        END IF;
        
      ELSE
        V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
        V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
        V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
        
        SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'ARCHIVO NO ENCONTRADO');
      END IF;
      
      P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
      COMMIT;
      
    ELSE
      SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'EL PROCESO YA FUE EJECUTADO');
      COMMIT;
    END IF;
    
    OPEN P_ERROR FOR SELECT * FROM ERROR_PROCESO_TEMP WHERE ID_LOTE=V_IDLOTE AND CODIGO_ARCHIVO=P_ARCHIVO_ID;
  EXCEPTION
  WHEN OTHERS THEN
    V_ERROR := SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
    
    ROLLBACK;
    
    SELECT COUNT(1) INTO V_LINEAS_CORRECTAS FROM ENTRADACHEQUE_EXT;
    V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ERRARDO;
    P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
    COMMIT;
    
    OPEN P_ERROR FOR SELECT V_IDLOTE ID_LOTE
         , P_ARCHIVO_ID CODIGO_ARCHIVO
         , NVL(V_ERROR, 'ERROR NO ESPECIFICADO') MENSAJE_ERROR
         , SYSDATE FECHA_ERROR
    FROM DUAL;
  END SP_CARGAR_ENTRADACHEQUE;
  
  PROCEDURE SP_CARGAR_ENTRADATALONARIO (P_ARCHIVO_ID INTEGER, P_NOMBRE_ARCHIVO VARCHAR2, P_CAPTURA OUT INTEGER, P_ERROR OUT SYS_REFCURSOR) IS
    V_ERROR             VARCHAR2(2000) := '';
    V_IDLOTE            NUMBER := 0;
    V_LOTEARCHIVO       LOTEARCHIVO%ROWTYPE;
    V_LINEAS            NUMBER := 0;
    V_LINEAS_CORRECTAS  NUMBER := 0;
    V_LINEAS_CON_ERROR  NUMBER := 0;
    V_NUMERO_ERRORES    NUMBER := 0;
    V_EJECUTADO         NUMBER := 0;
    V_ENTRADATALONARIO T_ENTRADATALONARIO;
    V_CURSOR            SYS_REFCURSOR;
    DML_ERRORS          EXCEPTION;
    PRAGMA EXCEPTION_INIT (DML_ERRORS, -24381);
  BEGIN
    P_CAPTURA := 0;
    
    V_LOTEARCHIVO.IDLOTE            := 0;
    V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
    V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
    V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
    
    V_EJECUTADO := FN_REGISTRAR_EJECUCION(P_ARCHIVO_ID);
    
    IF V_EJECUTADO = 1 THEN
      V_IDLOTE := P_REGISTRAR_LOTEARCHIVO(P_ARCHIVO_ID, P_NOMBRE_ARCHIVO);
      V_LOTEARCHIVO.IDLOTE := V_IDLOTE; P_CAPTURA := V_IDLOTE;
      SP_ALTER_CHARACTER_SESSION;
      
      
      SP_VERIFICAR_ARCHIVO('ENTRADATALONARIO_EXT', V_LINEAS, V_ERROR);
      IF V_LINEAS = 1 THEN -- Verifica si existe el archivo
        
        OPEN V_CURSOR FOR SELECT * FROM ENTRADATALONARIO_EXT;
        LOOP
          FETCH V_CURSOR BULK COLLECT INTO V_ENTRADATALONARIO LIMIT 500;
          EXIT WHEN V_ENTRADATALONARIO.NUMERO_LINEA.COUNT = 0;
          
          BEGIN
            FORALL I IN 1 .. V_ENTRADATALONARIO.NUMERO_LINEA.COUNT SAVE EXCEPTIONS
              INSERT INTO ENTRADATALONARIO(
                  CODIGOSECUENCIAL
                , INDICADORNUEVO
                , CODIGOENTIDAD
                , CODIGOCENTRO
                , NUMEROCUENTA
                , NUMEROPRIMERCHQ
                , NUMEROSERIE
                , NUMEROULTIMOCHQ
                , NUMEROCHEQUES
                , NUMEROCHQDISPONIBLES
                , FECHAALTA
                , FECHABAJA
                , INDICADORESTADO
                , CODIGOENTIDADTLN
                , CODIGOCENTROTLN
                , USUARIOREGISTRO
                , FECHAREGISTRO
                , IDLOTE
              ) VALUES  (
                  SQ_ENTRADATALONARIO.NEXTVAL
                , V_ENTRADATALONARIO.INDICADORNUEVO(I)
                , V_ENTRADATALONARIO.CODIGOENTIDAD(I)
                , V_ENTRADATALONARIO.CODIGOCENTRO(I)
                , V_ENTRADATALONARIO.NUMEROCUENTA(I)
                , V_ENTRADATALONARIO.NUMEROPRIMERCHQ(I)
                , V_ENTRADATALONARIO.NUMEROSERIE(I)
                , V_ENTRADATALONARIO.NUMEROULTIMOCHQ(I)
                , V_ENTRADATALONARIO.NUMEROCHEQUES(I)
                , V_ENTRADATALONARIO.NUMEROCHQDISPONIBLES(I)
                , V_ENTRADATALONARIO.FECHAALTA(I)
                , V_ENTRADATALONARIO.FECHABAJA(I)
                , V_ENTRADATALONARIO.INDICADORESTADO(I)
                , V_ENTRADATALONARIO.CODIGOENTIDADTLN(I)
                , V_ENTRADATALONARIO.CODIGOCENTROTLN(I)
                , USER
                , SYSDATE
                , V_IDLOTE
              );
            EXCEPTION
              WHEN DML_ERRORS THEN
                V_NUMERO_ERRORES := SQL%BULK_EXCEPTIONS.COUNT;
                FOR IDX IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
                LOOP
                  V_ERROR := 'OCURRIO UN ERROR EN LA LINEA [' || V_ENTRADATALONARIO.NUMERO_LINEA(SQL%BULK_EXCEPTIONS(IDX).ERROR_INDEX) || '] ' || SQLERRM(-SQL%BULK_EXCEPTIONS(IDX).ERROR_CODE);
                  V_LINEAS_CON_ERROR := V_LINEAS_CON_ERROR + 1;
                  SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, V_ERROR);
                END LOOP;
          END;
          
          IF V_NUMERO_ERRORES = 0 THEN
            V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + V_ENTRADATALONARIO.NUMERO_LINEA.COUNT;
          ELSE 
            IF (V_ENTRADATALONARIO.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES) > 0 THEN
              V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + (V_ENTRADATALONARIO.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES);
            END IF;
          END IF;
          
          V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
          V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ENPROCESO;
          
          P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
          COMMIT;
          
          V_NUMERO_ERRORES := 0;
        END LOOP;
        
        CLOSE V_CURSOR;
        COMMIT;
        DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
                
        V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
        V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
        
        IF V_LINEAS_CON_ERROR > 0 THEN
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_ERRARDO;
        ELSE
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_TERMINADO;
        END IF;
        
      ELSE
        V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
        V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
        V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
        
        SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'ARCHIVO NO ENCONTRADO');
      END IF;
      
      P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
      COMMIT;
      
    ELSE
      SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'EL PROCESO YA FUE EJECUTADO');
      COMMIT;
    END IF;
    
    OPEN P_ERROR FOR SELECT * FROM ERROR_PROCESO_TEMP WHERE ID_LOTE=V_IDLOTE AND CODIGO_ARCHIVO=P_ARCHIVO_ID;
  EXCEPTION
  WHEN OTHERS THEN
    V_ERROR := SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
    
    ROLLBACK;
    
    SELECT COUNT(1) INTO V_LINEAS_CORRECTAS FROM ENTRADATALONARIO_EXT;
    V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ERRARDO;
    P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
    COMMIT;
    
    OPEN P_ERROR FOR SELECT V_IDLOTE ID_LOTE
         , P_ARCHIVO_ID CODIGO_ARCHIVO
         , NVL(V_ERROR, 'ERROR NO ESPECIFICADO') MENSAJE_ERROR
         , SYSDATE FECHA_ERROR
    FROM DUAL;
  END SP_CARGAR_ENTRADATALONARIO;
  
  PROCEDURE SP_CARGAR_ENTRADACLIENTE (P_ARCHIVO_ID INTEGER, P_NOMBRE_ARCHIVO VARCHAR2, P_CAPTURA OUT INTEGER, P_ERROR OUT SYS_REFCURSOR) IS
    V_ERROR             VARCHAR2(2000) := '';
    V_IDLOTE            NUMBER := 0;
    V_LOTEARCHIVO       LOTEARCHIVO%ROWTYPE;
    V_LINEAS            NUMBER := 0;
    V_LINEAS_CORRECTAS  NUMBER := 0;
    V_LINEAS_CON_ERROR  NUMBER := 0;
    V_NUMERO_ERRORES    NUMBER := 0;
    V_EJECUTADO         NUMBER := 0;
    V_ENTRADACLIENTE T_ENTRADACLIENTE;
    V_CURSOR            SYS_REFCURSOR;
    DML_ERRORS          EXCEPTION;
    PRAGMA EXCEPTION_INIT (DML_ERRORS, -24381);
  BEGIN
    P_CAPTURA := 0;
    
    V_LOTEARCHIVO.IDLOTE            := 0;
    V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
    V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
    V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
    
    V_EJECUTADO := FN_REGISTRAR_EJECUCION(P_ARCHIVO_ID);
    
    IF V_EJECUTADO = 1 THEN
      V_IDLOTE := P_REGISTRAR_LOTEARCHIVO(P_ARCHIVO_ID, P_NOMBRE_ARCHIVO);
      V_LOTEARCHIVO.IDLOTE := V_IDLOTE; P_CAPTURA := V_IDLOTE;
      SP_ALTER_CHARACTER_SESSION;
      
      
      SP_VERIFICAR_ARCHIVO('ENTRADACLIENTE_EXT', V_LINEAS, V_ERROR);
      IF V_LINEAS = 1 THEN -- Verifica si existe el archivo
        
        OPEN V_CURSOR FOR SELECT * FROM ENTRADACLIENTE_EXT;
        LOOP
          FETCH V_CURSOR BULK COLLECT INTO V_ENTRADACLIENTE LIMIT 500;
          EXIT WHEN V_ENTRADACLIENTE.NUMERO_LINEA.COUNT = 0;
          
          BEGIN
            FORALL I IN 1 .. V_ENTRADACLIENTE.NUMERO_LINEA.COUNT SAVE EXCEPTIONS
              INSERT INTO ENTRADACLIENTE(
                  CODIGOSECUENCIAL
                , NUMEROCLIENTE
                , CODIGOIDENTIFICACION
                , NUMEROIDENTIFICACION
                , DIGITOIDENTIFICACION
                , INDICADORESTADO
                , FECHANACIMIENTO
                , INDICADORCLIENTE
                , INDICADORGRUPO
                , CODIGOTITULO
                , PRIMERAPELLIDO
                , SEGUNDOAPELLIDO
                , NOMBRECLIENTE
                , NOMBRETARJETA
                , DESCRIPCIONDIRECCION1
                , DESCRIPCIONCALLE1
                , DESCRIPCIONCALLE2
                , DESCRIPCIONDIRECCION2
                , DESCRIPCIONDIRECCION3
                , NUMERODIRECCION
                , CODIGOPOSTAL
                , CODIGOESTADO
                , TIPOTELEFONO1
                , CODIGOPREFIJO1
                , NUMEROTELEFONO1
                , NUMEROEXTTELEFONO1
                , TIPOTELEFONO2
                , CODIGOPREFIJO2
                , NUMEROTELEFONO2
                , NUMEROEXTTELEFONO2
                , TIPOTELEFONO3
                , CODIGOPREFIJO3
                , NUMEROTELEFONO3
                , NUMEROEXTTELEFONO3
                , CODIGOESTADOCIVIL
                , CODIGOSEXO
                , CODIGOGRUPOCLIENTE
                , CODIGODIRECCION1
                , CODIGODIRECCION2
                , CODIGOPROVINCIA
                , CODIGODISTRITO
                , CODIGOSEGMENTACION
                , DESCRIPCIONSEGMENTACION
                , NOMBRE_COMPLETO
                , USUARIOREGISTRO
                , FECHAREGISTRO
                , IDLOTE
              ) VALUES  (
                  SQ_ENTRADACLIENTE.NEXTVAL
                , V_ENTRADACLIENTE.NUMEROCLIENTE(I)
                , V_ENTRADACLIENTE.CODIGOIDENTIFICACION(I)
                , V_ENTRADACLIENTE.NUMEROIDENTIFICACION(I)
                , V_ENTRADACLIENTE.DIGITOIDENTIFICACION(I)
                , V_ENTRADACLIENTE.INDICADORESTADO(I)
                , V_ENTRADACLIENTE.FECHANACIMIENTO(I)
                , V_ENTRADACLIENTE.INDICADORCLIENTE(I)
                , V_ENTRADACLIENTE.INDICADORGRUPO(I)
                , V_ENTRADACLIENTE.CODIGOTITULO(I)
                , V_ENTRADACLIENTE.PRIMERAPELLIDO(I)
                , V_ENTRADACLIENTE.SEGUNDOAPELLIDO(I)
                , V_ENTRADACLIENTE.NOMBRECLIENTE(I)
                , V_ENTRADACLIENTE.NOMBRETARJETA(I)
                , V_ENTRADACLIENTE.DESCRIPCIONDIRECCION1(I)
                , V_ENTRADACLIENTE.DESCRIPCIONCALLE1(I)
                , V_ENTRADACLIENTE.DESCRIPCIONCALLE2(I)
                , V_ENTRADACLIENTE.DESCRIPCIONDIRECCION2(I)
                , V_ENTRADACLIENTE.DESCRIPCIONDIRECCION3(I)
                , V_ENTRADACLIENTE.NUMERODIRECCION(I)
                , V_ENTRADACLIENTE.CODIGOPOSTAL(I)
                , V_ENTRADACLIENTE.CODIGOESTADO(I)
                , V_ENTRADACLIENTE.TIPOTELEFONO1(I)
                , V_ENTRADACLIENTE.CODIGOPREFIJO1(I)
                , V_ENTRADACLIENTE.NUMEROTELEFONO1(I)
                , V_ENTRADACLIENTE.NUMEROEXTTELEFONO1(I)
                , V_ENTRADACLIENTE.TIPOTELEFONO2(I)
                , V_ENTRADACLIENTE.CODIGOPREFIJO2(I)
                , V_ENTRADACLIENTE.NUMEROTELEFONO2(I)
                , V_ENTRADACLIENTE.NUMEROEXTTELEFONO2(I)
                , V_ENTRADACLIENTE.TIPOTELEFONO3(I)
                , V_ENTRADACLIENTE.CODIGOPREFIJO3(I)
                , V_ENTRADACLIENTE.NUMEROTELEFONO3(I)
                , V_ENTRADACLIENTE.NUMEROEXTTELEFONO3(I)
                , V_ENTRADACLIENTE.CODIGOESTADOCIVIL(I)
                , V_ENTRADACLIENTE.CODIGOSEXO(I)
                , V_ENTRADACLIENTE.CODIGOGRUPOCLIENTE(I)
                , V_ENTRADACLIENTE.CODIGODIRECCION1(I)
                , V_ENTRADACLIENTE.CODIGODIRECCION2(I)
                , V_ENTRADACLIENTE.CODIGOPROVINCIA(I)
                , V_ENTRADACLIENTE.CODIGODISTRITO(I)
                , V_ENTRADACLIENTE.CODIGOSEGMENTACION(I)
                , V_ENTRADACLIENTE.DESCRIPCIONSEGMENTACION(I)
                , (SELECT CASE WHEN V_ENTRADACLIENTE.CODIGOIDENTIFICACION(I) = 'R' AND NOT V_ENTRADACLIENTE.NUMEROIDENTIFICACION(I) LIKE '10%'
                      THEN NVL(V_ENTRADACLIENTE.NOMBRECLIENTE(I),'')||NVL(V_ENTRADACLIENTE.PRIMERAPELLIDO(I),'')||NVL(V_ENTRADACLIENTE.SEGUNDOAPELLIDO(I),'')
                      ELSE NVL(V_ENTRADACLIENTE.NOMBRECLIENTE(I),'')||' '||NVL(V_ENTRADACLIENTE.PRIMERAPELLIDO(I),'')||' '||NVL(V_ENTRADACLIENTE.SEGUNDOAPELLIDO(I),'') END
                   FROM DUAL)
                , USER
                , SYSDATE
                , V_IDLOTE
              );
            EXCEPTION
              WHEN DML_ERRORS THEN
                V_NUMERO_ERRORES := SQL%BULK_EXCEPTIONS.COUNT;
                FOR IDX IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
                LOOP
                  V_ERROR := 'OCURRIO UN ERROR EN LA LINEA [' || V_ENTRADACLIENTE.NUMERO_LINEA(SQL%BULK_EXCEPTIONS(IDX).ERROR_INDEX) || '] ' || SQLERRM(-SQL%BULK_EXCEPTIONS(IDX).ERROR_CODE);
                  V_LINEAS_CON_ERROR := V_LINEAS_CON_ERROR + 1;
                  SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, V_ERROR);
                END LOOP;
          END;
          
          IF V_NUMERO_ERRORES = 0 THEN
            V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + V_ENTRADACLIENTE.NUMERO_LINEA.COUNT;
          ELSE 
            IF (V_ENTRADACLIENTE.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES) > 0 THEN
              V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + (V_ENTRADACLIENTE.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES);
            END IF;
          END IF;
          
          V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
          V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ENPROCESO;
          
          P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
          COMMIT;
          
          V_NUMERO_ERRORES := 0;
        END LOOP;
        
        CLOSE V_CURSOR;
        COMMIT;
        DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
                
        V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
        V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
        
        IF V_LINEAS_CON_ERROR > 0 THEN
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_ERRARDO;
        ELSE
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_TERMINADO;
        END IF;
        
      ELSE
        V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
        V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
        V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
        
        SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'ARCHIVO NO ENCONTRADO');
      END IF;
      
      P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
      COMMIT;
      
    ELSE
      SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'EL PROCESO YA FUE EJECUTADO');
      COMMIT;
    END IF;
    
    OPEN P_ERROR FOR SELECT * FROM ERROR_PROCESO_TEMP WHERE ID_LOTE=V_IDLOTE AND CODIGO_ARCHIVO=P_ARCHIVO_ID;
  EXCEPTION
  WHEN OTHERS THEN
    V_ERROR := SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
    
    ROLLBACK;
    
    SELECT COUNT(1) INTO V_LINEAS_CORRECTAS FROM ENTRADACLIENTE_EXT;
    V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ERRARDO;
    P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
    COMMIT;
    
    OPEN P_ERROR FOR SELECT V_IDLOTE ID_LOTE
         , P_ARCHIVO_ID CODIGO_ARCHIVO
         , NVL(V_ERROR, 'ERROR NO ESPECIFICADO') MENSAJE_ERROR
         , SYSDATE FECHA_ERROR
    FROM DUAL;
  END SP_CARGAR_ENTRADACLIENTE;
  
  PROCEDURE SP_CARGAR_ENTRADACLIENTECUENTA (P_ARCHIVO_ID INTEGER, P_NOMBRE_ARCHIVO VARCHAR2, P_CAPTURA OUT INTEGER, P_ERROR OUT SYS_REFCURSOR) IS
    V_ERROR             VARCHAR2(2000) := '';
    V_IDLOTE            NUMBER := 0;
    V_LOTEARCHIVO       LOTEARCHIVO%ROWTYPE;
    V_LINEAS            NUMBER := 0;
    V_LINEAS_CORRECTAS  NUMBER := 0;
    V_LINEAS_CON_ERROR  NUMBER := 0;
    V_NUMERO_ERRORES    NUMBER := 0;
    V_EJECUTADO         NUMBER := 0;
    V_ENTRADACLIENTECUENTA T_ENTRADACLIENTECUENTA;
    V_CURSOR            SYS_REFCURSOR;
    DML_ERRORS          EXCEPTION;
    PRAGMA EXCEPTION_INIT (DML_ERRORS, -24381);
  BEGIN
    P_CAPTURA := 0;
    
    V_LOTEARCHIVO.IDLOTE            := 0;
    V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
    V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
    V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
    
    V_EJECUTADO := FN_REGISTRAR_EJECUCION(P_ARCHIVO_ID);
    
    IF V_EJECUTADO = 1 THEN
      V_IDLOTE := P_REGISTRAR_LOTEARCHIVO(P_ARCHIVO_ID, P_NOMBRE_ARCHIVO);
      V_LOTEARCHIVO.IDLOTE := V_IDLOTE; P_CAPTURA := V_IDLOTE;
      SP_ALTER_CHARACTER_SESSION;
      
      
      SP_VERIFICAR_ARCHIVO('ENTRADACLIENTECUENTA_EXT', V_LINEAS, V_ERROR);
      IF V_LINEAS = 1 THEN -- Verifica si existe el archivo
        
        OPEN V_CURSOR FOR SELECT * FROM ENTRADACLIENTECUENTA_EXT;
        LOOP
          FETCH V_CURSOR BULK COLLECT INTO V_ENTRADACLIENTECUENTA LIMIT 500;
          EXIT WHEN V_ENTRADACLIENTECUENTA.NUMERO_LINEA.COUNT = 0;
          
          BEGIN
            FORALL I IN 1 .. V_ENTRADACLIENTECUENTA.NUMERO_LINEA.COUNT SAVE EXCEPTIONS
              INSERT INTO ENTRADACLIENTECUENTA(
                  CODIGOSECUENCIAL
                , NUMEROCLIENTE
                , ENTIDADCUENTA
                , OFICINACUENTA
                , CODIGOSERVICIO
                , NUMEROCONTRATO
                , CODIGOCALIDAD
                , SECUENCIAINTERVENCION
                , FECHAAPERTURA
                , INDICADORESTADO
                , USUARIOREGISTRO
                , FECHAREGISTRO
                , IDLOTE
              ) VALUES  (
                  SQ_ENTRADACLIENTECUENTA.NEXTVAL
                , V_ENTRADACLIENTECUENTA.NUMEROCLIENTE(I)
                , V_ENTRADACLIENTECUENTA.ENTIDADCUENTA(I)
                , V_ENTRADACLIENTECUENTA.OFICINACUENTA(I)
                , V_ENTRADACLIENTECUENTA.CODIGOSERVICIO(I)
                , V_ENTRADACLIENTECUENTA.NUMEROCONTRATO(I)
                , V_ENTRADACLIENTECUENTA.CODIGOCALIDAD(I)
                , V_ENTRADACLIENTECUENTA.SECUENCIAINTERVENCION(I)
                , V_ENTRADACLIENTECUENTA.FECHAAPERTURA(I)
                , V_ENTRADACLIENTECUENTA.INDICADORESTADO(I)
                , USER
                , SYSDATE
                , V_IDLOTE
              );
            EXCEPTION
              WHEN DML_ERRORS THEN
                V_NUMERO_ERRORES := SQL%BULK_EXCEPTIONS.COUNT;
                FOR IDX IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
                LOOP
                  V_ERROR := 'OCURRIO UN ERROR EN LA LINEA [' || V_ENTRADACLIENTECUENTA.NUMERO_LINEA(SQL%BULK_EXCEPTIONS(IDX).ERROR_INDEX) || '] ' || SQLERRM(-SQL%BULK_EXCEPTIONS(IDX).ERROR_CODE);
                  V_LINEAS_CON_ERROR := V_LINEAS_CON_ERROR + 1;
                  SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, V_ERROR);
                END LOOP;
          END;
          
          IF V_NUMERO_ERRORES = 0 THEN
            V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + V_ENTRADACLIENTECUENTA.NUMERO_LINEA.COUNT;
          ELSE 
            IF (V_ENTRADACLIENTECUENTA.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES) > 0 THEN
              V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + (V_ENTRADACLIENTECUENTA.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES);
            END IF;
          END IF;
          
          V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
          V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ENPROCESO;
          
          P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
          COMMIT;
          
          V_NUMERO_ERRORES := 0;
        END LOOP;
        
        CLOSE V_CURSOR;
        COMMIT;
        DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
                
        V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
        V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
        
        IF V_LINEAS_CON_ERROR > 0 THEN
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_ERRARDO;
        ELSE
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_TERMINADO;
        END IF;
        
      ELSE
        V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
        V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
        V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
        
        SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'ARCHIVO NO ENCONTRADO');
      END IF;
      
      P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
      COMMIT;
      
    ELSE
      SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'EL PROCESO YA FUE EJECUTADO');
      COMMIT;
    END IF;
    
    OPEN P_ERROR FOR SELECT * FROM ERROR_PROCESO_TEMP WHERE ID_LOTE=V_IDLOTE AND CODIGO_ARCHIVO=P_ARCHIVO_ID;
  EXCEPTION
  WHEN OTHERS THEN
    V_ERROR := SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
    
    ROLLBACK;
    
    SELECT COUNT(1) INTO V_LINEAS_CORRECTAS FROM ENTRADACLIENTECUENTA_EXT;
    V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ERRARDO;
    P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
    COMMIT;
    
    OPEN P_ERROR FOR SELECT V_IDLOTE ID_LOTE
         , P_ARCHIVO_ID CODIGO_ARCHIVO
         , NVL(V_ERROR, 'ERROR NO ESPECIFICADO') MENSAJE_ERROR
         , SYSDATE FECHA_ERROR
    FROM DUAL;
  END SP_CARGAR_ENTRADACLIENTECUENTA;
  
  PROCEDURE SP_CARGAR_ENTRADACUENTA (P_ARCHIVO_ID INTEGER, P_NOMBRE_ARCHIVO VARCHAR2, P_CAPTURA OUT INTEGER, P_ERROR OUT SYS_REFCURSOR) IS
    V_ERROR             VARCHAR2(2000) := '';
    V_IDLOTE            NUMBER := 0;
    V_LOTEARCHIVO       LOTEARCHIVO%ROWTYPE;
    V_LINEAS            NUMBER := 0;
    V_LINEAS_CORRECTAS  NUMBER := 0;
    V_LINEAS_CON_ERROR  NUMBER := 0;
    V_NUMERO_ERRORES    NUMBER := 0;
    V_EJECUTADO         NUMBER := 0;
    V_ENTRADACUENTA T_ENTRADACUENTA;
    V_CURSOR            SYS_REFCURSOR;
    DML_ERRORS          EXCEPTION;
    PRAGMA EXCEPTION_INIT (DML_ERRORS, -24381);
  BEGIN
    P_CAPTURA := 0;
    
    V_LOTEARCHIVO.IDLOTE            := 0;
    V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
    V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
    V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
    
    V_EJECUTADO := FN_REGISTRAR_EJECUCION(P_ARCHIVO_ID);
    
    IF V_EJECUTADO = 1 THEN
      V_IDLOTE := P_REGISTRAR_LOTEARCHIVO(P_ARCHIVO_ID, P_NOMBRE_ARCHIVO);
      V_LOTEARCHIVO.IDLOTE := V_IDLOTE; P_CAPTURA := V_IDLOTE;
      SP_ALTER_CHARACTER_SESSION;
      
      
      SP_VERIFICAR_ARCHIVO('ENTRADACUENTA_EXT', V_LINEAS, V_ERROR);
      IF V_LINEAS = 1 THEN -- Verifica si existe el archivo
        
        OPEN V_CURSOR FOR SELECT * FROM ENTRADACUENTA_EXT;
        LOOP
          FETCH V_CURSOR BULK COLLECT INTO V_ENTRADACUENTA LIMIT 500;
          EXIT WHEN V_ENTRADACUENTA.NUMERO_LINEA.COUNT = 0;
          
          BEGIN
            FORALL I IN 1 .. V_ENTRADACUENTA.NUMERO_LINEA.COUNT SAVE EXCEPTIONS
              MERGE INTO ENTRADACUENTA A
              USING (SELECT
                    V_ENTRADACUENTA.INDICADORNUEVO(I) INDICADORNUEVO
                  , V_ENTRADACUENTA.CODIGOENTIDAD(I) CODIGOENTIDAD
                  , V_ENTRADACUENTA.CODIGOCENTROALTA(I) CODIGOCENTROALTA
                  , V_ENTRADACUENTA.NUMEROCUENTA(I) NUMEROCUENTA
                  , V_ENTRADACUENTA.DIGITOCONTROL1(I) DIGITOCONTROL1
                  , V_ENTRADACUENTA.DIGITOCONTROL2(I) DIGITOCONTROL2
                  , V_ENTRADACUENTA.CODIGOPRODUCTO(I) CODIGOPRODUCTO
                  , V_ENTRADACUENTA.CODIGOSUBPRODUCTO(I) CODIGOSUBPRODUCTO
                  , V_ENTRADACUENTA.CODIGODIVISA(I) CODIGODIVISA
                  , V_ENTRADACUENTA.CODIGOCENTROCONTABLE(I) CODIGOCENTROCONTABLE
                  , V_ENTRADACUENTA.LINEACREDITO(I) LINEACREDITO
                  , V_ENTRADACUENTA.RETENCION(I) RETENCION
                  , V_ENTRADACUENTA.IMPAGO(I) IMPAGO
                  , V_ENTRADACUENTA.SALDOCONTABLE(I) SALDOCONTABLE
                  , V_ENTRADACUENTA.INDICADORSITUACIONCTA(I) INDICADORSITUACIONCTA
                  , V_ENTRADACUENTA.INDICADORCONDICIONCTA(I) INDICADORCONDICIONCTA
                  , V_ENTRADACUENTA.INDICADORINMOVILIZADA(I) INDICADORINMOVILIZADA
                  , NVL(V_ENTRADACUENTA.SALDOCONTABLE(I),0) + NVL(V_ENTRADACUENTA.LINEACREDITO(I),0) - NVL(V_ENTRADACUENTA.RETENCION(I),0) - NVL(V_ENTRADACUENTA.IMPAGO(I),0) SALDODISPONIBLE
                  , NVL(V_ENTRADACUENTA.SALDOCONTABLE(I),0) + NVL(V_ENTRADACUENTA.LINEACREDITO(I),0) - NVL(V_ENTRADACUENTA.RETENCION(I),0) - NVL(V_ENTRADACUENTA.IMPAGO(I),0) SALDODISPONIBLE_CNG
                  , V_ENTRADACUENTA.SALDOCONTABLE(I) SALDOCONTABLE_CNG
                  , USER USUARIOREGISTRO
                  , SYSDATE FECHAREGISTRO
                  , V_IDLOTE IDLOTE
                  , V_ENTRADACUENTA.CODIGOENTIDAD(I)
                    || V_ENTRADACUENTA.CODIGOCENTROALTA(I)
                    || V_ENTRADACUENTA.NUMEROCUENTA(I) NUMEROCUENTACENTRO
                FROM DUAL
              ) B ON (
                     B.INDICADORNUEVO   = 'M'
                 AND A.CODIGOENTIDAD || A.CODIGOCENTROALTA || A.NUMEROCUENTA = B.NUMEROCUENTACENTRO
              ) WHEN MATCHED THEN
                  UPDATE SET
                      A.INDICADORNUEVO        = B.INDICADORNUEVO
                    , A.DIGITOCONTROL1        = B.DIGITOCONTROL1
                    , A.DIGITOCONTROL2        = B.DIGITOCONTROL2
                    , A.CODIGOPRODUCTO        = B.CODIGOPRODUCTO
                    , A.CODIGOSUBPRODUCTO     = B.CODIGOSUBPRODUCTO
                    , A.CODIGODIVISA          = B.CODIGODIVISA
                    , A.CODIGOCENTROCONTABLE  = B.CODIGOCENTROCONTABLE
                    , A.LINEACREDITO          = B.LINEACREDITO
                    , A.RETENCION             = B.RETENCION
                    , A.IMPAGO                = B.IMPAGO
                    , A.SALDOCONTABLE         = B.SALDOCONTABLE
                    , A.INDICADORSITUACIONCTA = B.INDICADORSITUACIONCTA
                    , A.INDICADORCONDICIONCTA = B.INDICADORCONDICIONCTA
                    , A.INDICADORINMOVILIZADA = B.INDICADORINMOVILIZADA
                    , A.SALDODISPONIBLE       = B.SALDODISPONIBLE
                    , A.SALDODISPONIBLE_CNG   = B.SALDODISPONIBLE_CNG
                    , A.SALDOCONTABLE_CNG     = B.SALDOCONTABLE_CNG
                    , A.USUARIOMODIFICACION   = B.USUARIOREGISTRO
                    , A.FECHAMODIFICACION     = B.FECHAREGISTRO
                    , A.IDLOTE                = B.IDLOTE
              WHEN NOT MATCHED THEN
                  INSERT (
                      A.CODIGOSECUENCIAL
                    , A.INDICADORNUEVO
                    , A.CODIGOENTIDAD
                    , A.CODIGOCENTROALTA
                    , A.NUMEROCUENTA
                    , A.DIGITOCONTROL1
                    , A.DIGITOCONTROL2
                    , A.CODIGOPRODUCTO
                    , A.CODIGOSUBPRODUCTO
                    , A.CODIGODIVISA
                    , A.CODIGOCENTROCONTABLE
                    , A.LINEACREDITO
                    , A.RETENCION
                    , A.IMPAGO
                    , A.SALDOCONTABLE
                    , A.INDICADORSITUACIONCTA
                    , A.INDICADORCONDICIONCTA
                    , A.INDICADORINMOVILIZADA
                    , A.SALDODISPONIBLE
                    , A.SALDODISPONIBLE_CNG
                    , A.SALDOCONTABLE_CNG
                    , A.USUARIOREGISTRO
                    , A.FECHAREGISTRO
                    , A.IDLOTE
                  ) VALUES  (
                      SQ_ENTRADACUENTA.NEXTVAL
                    , B.INDICADORNUEVO
                    , B.CODIGOENTIDAD
                    , B.CODIGOCENTROALTA
                    , B.NUMEROCUENTA
                    , B.DIGITOCONTROL1
                    , B.DIGITOCONTROL2
                    , B.CODIGOPRODUCTO
                    , B.CODIGOSUBPRODUCTO
                    , B.CODIGODIVISA
                    , B.CODIGOCENTROCONTABLE
                    , B.LINEACREDITO
                    , B.RETENCION
                    , B.IMPAGO
                    , B.SALDOCONTABLE
                    , B.INDICADORSITUACIONCTA
                    , B.INDICADORCONDICIONCTA
                    , B.INDICADORINMOVILIZADA
                    , B.SALDODISPONIBLE
                    , B.SALDODISPONIBLE_CNG
                    , B.SALDOCONTABLE_CNG
                    , B.USUARIOREGISTRO
                    , B.FECHAREGISTRO
                    , B.IDLOTE
                  );
            EXCEPTION
              WHEN DML_ERRORS THEN
                V_NUMERO_ERRORES := SQL%BULK_EXCEPTIONS.COUNT;
                FOR IDX IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
                LOOP
                  V_ERROR := 'OCURRIO UN ERROR EN LA LINEA [' || V_ENTRADACUENTA.NUMERO_LINEA(SQL%BULK_EXCEPTIONS(IDX).ERROR_INDEX) || '] ' || SQLERRM(-SQL%BULK_EXCEPTIONS(IDX).ERROR_CODE);
                  V_LINEAS_CON_ERROR := V_LINEAS_CON_ERROR + 1;
                  SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, V_ERROR);
                END LOOP;
          END;
          
          IF V_NUMERO_ERRORES = 0 THEN
            V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + V_ENTRADACUENTA.NUMERO_LINEA.COUNT;
          ELSE 
            IF (V_ENTRADACUENTA.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES) > 0 THEN
              V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + (V_ENTRADACUENTA.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES);
            END IF;
          END IF;
          
          V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
          V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ENPROCESO;
          
          P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
          COMMIT;
          
          V_NUMERO_ERRORES := 0;
        END LOOP;
        
        CLOSE V_CURSOR;
        COMMIT;
        DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
                
        V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
        V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
        
        IF V_LINEAS_CON_ERROR > 0 THEN
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_ERRARDO;
        ELSE
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_TERMINADO;
        END IF;
        
      ELSE
        V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
        V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
        V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
        
        SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'ARCHIVO NO ENCONTRADO');
      END IF;
      
      P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
      COMMIT;
      
    ELSE
      SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'EL PROCESO YA FUE EJECUTADO');
      COMMIT;
    END IF;
    
    OPEN P_ERROR FOR SELECT * FROM ERROR_PROCESO_TEMP WHERE ID_LOTE=V_IDLOTE AND CODIGO_ARCHIVO=P_ARCHIVO_ID;
  EXCEPTION
  WHEN OTHERS THEN
    V_ERROR := SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
    
    ROLLBACK;
    
    SELECT COUNT(1) INTO V_LINEAS_CORRECTAS FROM ENTRADACUENTA_EXT;
    V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ERRARDO;
    P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
    COMMIT;
    
    OPEN P_ERROR FOR SELECT V_IDLOTE ID_LOTE
         , P_ARCHIVO_ID CODIGO_ARCHIVO
         , NVL(V_ERROR, 'ERROR NO ESPECIFICADO') MENSAJE_ERROR
         , SYSDATE FECHA_ERROR
    FROM DUAL;
  END SP_CARGAR_ENTRADACUENTA;
  
  PROCEDURE SP_CARGAR_ENTRADACONTRATO (P_ARCHIVO_ID INTEGER, P_NOMBRE_ARCHIVO VARCHAR2, P_CAPTURA OUT INTEGER, P_ERROR OUT SYS_REFCURSOR) IS
    V_ERROR             VARCHAR2(2000) := '';
    V_IDLOTE            NUMBER := 0;
    V_LOTEARCHIVO       LOTEARCHIVO%ROWTYPE;
    V_LINEAS            NUMBER := 0;
    V_LINEAS_CORRECTAS  NUMBER := 0;
    V_LINEAS_CON_ERROR  NUMBER := 0;
    V_NUMERO_ERRORES    NUMBER := 0;
    V_EJECUTADO         NUMBER := 0;
    V_ENTRADACONTRATO T_ENTRADACONTRATO;
    V_CURSOR            SYS_REFCURSOR;
    DML_ERRORS          EXCEPTION;
    PRAGMA EXCEPTION_INIT (DML_ERRORS, -24381);
  BEGIN
    P_CAPTURA := 0;
    
    V_LOTEARCHIVO.IDLOTE            := 0;
    V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
    V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
    V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
    
    V_EJECUTADO := FN_REGISTRAR_EJECUCION(P_ARCHIVO_ID);
    
    IF V_EJECUTADO = 1 THEN
      V_IDLOTE := P_REGISTRAR_LOTEARCHIVO(P_ARCHIVO_ID, P_NOMBRE_ARCHIVO);
      V_LOTEARCHIVO.IDLOTE := V_IDLOTE; P_CAPTURA := V_IDLOTE;
      SP_ALTER_CHARACTER_SESSION;
      
      
      SP_VERIFICAR_ARCHIVO('ENTRADACONTRATO_EXT', V_LINEAS, V_ERROR);
      IF V_LINEAS = 1 THEN -- Verifica si existe el archivo
        
        OPEN V_CURSOR FOR SELECT * FROM ENTRADACONTRATO_EXT;
        LOOP
          FETCH V_CURSOR BULK COLLECT INTO V_ENTRADACONTRATO LIMIT 500;
          EXIT WHEN V_ENTRADACONTRATO.NUMERO_LINEA.COUNT = 0;
          
          BEGIN
            FORALL I IN 1 .. V_ENTRADACONTRATO.NUMERO_LINEA.COUNT SAVE EXCEPTIONS
              INSERT INTO ENTRADACONTRATO(
                  CODIGOSECUENCIAL
                , ENTIDADCONTRATO
                , OFICINACONTRATO
                , TIPOCONTRATO
                , NUMEROCONTRATO
                , ENTIDADCUENTA
                , OFICINACUENTA
                , TIPOCUENTA
                , NUMEROCUENTA
                , INDICADORCUENTA
                , USUARIOREGISTRO
                , FECHAREGISTRO
                , IDLOTE
              ) VALUES  (
                  SQ_ENTRADACONTRATO.NEXTVAL
                , V_ENTRADACONTRATO.ENTIDADCONTRATO(I)
                , V_ENTRADACONTRATO.OFICINACONTRATO(I)
                , V_ENTRADACONTRATO.TIPOCONTRATO(I)
                , V_ENTRADACONTRATO.NUMEROCONTRATO(I)
                , V_ENTRADACONTRATO.ENTIDADCUENTA(I)
                , V_ENTRADACONTRATO.OFICINACUENTA(I)
                , V_ENTRADACONTRATO.TIPOCUENTA(I)
                , V_ENTRADACONTRATO.NUMEROCUENTA(I)
                , V_ENTRADACONTRATO.INDICADORCUENTA(I)
                , USER
                , SYSDATE
                , V_IDLOTE
              );
            EXCEPTION
              WHEN DML_ERRORS THEN
                V_NUMERO_ERRORES := SQL%BULK_EXCEPTIONS.COUNT;
                FOR IDX IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
                LOOP
                  V_ERROR := 'OCURRIO UN ERROR EN LA LINEA [' || V_ENTRADACONTRATO.NUMERO_LINEA(SQL%BULK_EXCEPTIONS(IDX).ERROR_INDEX) || '] ' || SQLERRM(-SQL%BULK_EXCEPTIONS(IDX).ERROR_CODE);
                  V_LINEAS_CON_ERROR := V_LINEAS_CON_ERROR + 1;
                  SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, V_ERROR);
                END LOOP;
          END;
          
          IF V_NUMERO_ERRORES = 0 THEN
            V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + V_ENTRADACONTRATO.NUMERO_LINEA.COUNT;
          ELSE 
            IF (V_ENTRADACONTRATO.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES) > 0 THEN
              V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + (V_ENTRADACONTRATO.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES);
            END IF;
          END IF;
          
          V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
          V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ENPROCESO;
          
          P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
          COMMIT;
          
          V_NUMERO_ERRORES := 0;
        END LOOP;
        
        CLOSE V_CURSOR;
        COMMIT;
        DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
                
        V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
        V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
        
        IF V_LINEAS_CON_ERROR > 0 THEN
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_ERRARDO;
        ELSE
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_TERMINADO;
        END IF;
        
      ELSE
        V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
        V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
        V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
        
        SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'ARCHIVO NO ENCONTRADO');
      END IF;
      
      P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
      COMMIT;
      
    ELSE
      SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'EL PROCESO YA FUE EJECUTADO');
      COMMIT;
    END IF;
    
    OPEN P_ERROR FOR SELECT * FROM ERROR_PROCESO_TEMP WHERE ID_LOTE=V_IDLOTE AND CODIGO_ARCHIVO=P_ARCHIVO_ID;
  EXCEPTION
  WHEN OTHERS THEN
    V_ERROR := SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
    
    ROLLBACK;
    
    SELECT COUNT(1) INTO V_LINEAS_CORRECTAS FROM ENTRADACONTRATO_EXT;
    V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ERRARDO;
    P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
    COMMIT;
    
    OPEN P_ERROR FOR SELECT V_IDLOTE ID_LOTE
         , P_ARCHIVO_ID CODIGO_ARCHIVO
         , NVL(V_ERROR, 'ERROR NO ESPECIFICADO') MENSAJE_ERROR
         , SYSDATE FECHA_ERROR
    FROM DUAL;
  END SP_CARGAR_ENTRADACONTRATO;
  
  PROCEDURE SP_CARGAR_ENTRADATARJETA (P_ARCHIVO_ID INTEGER, P_NOMBRE_ARCHIVO VARCHAR2, P_CAPTURA OUT INTEGER, P_ERROR OUT SYS_REFCURSOR) IS
    V_ERROR             VARCHAR2(2000) := '';
    V_IDLOTE            NUMBER := 0;
    V_LOTEARCHIVO       LOTEARCHIVO%ROWTYPE;
    V_LINEAS            NUMBER := 0;
    V_LINEAS_CORRECTAS  NUMBER := 0;
    V_LINEAS_CON_ERROR  NUMBER := 0;
    V_NUMERO_ERRORES    NUMBER := 0;
    V_EJECUTADO         NUMBER := 0;
    V_ENTRADATARJETA T_ENTRADATARJETA;
    V_CURSOR            SYS_REFCURSOR;
    DML_ERRORS          EXCEPTION;
    PRAGMA EXCEPTION_INIT (DML_ERRORS, -24381);
  BEGIN
    P_CAPTURA := 0;
    
    V_LOTEARCHIVO.IDLOTE            := 0;
    V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
    V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
    V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
    
    V_EJECUTADO := FN_REGISTRAR_EJECUCION(P_ARCHIVO_ID);
    
    IF V_EJECUTADO = 1 THEN
      V_IDLOTE := P_REGISTRAR_LOTEARCHIVO(P_ARCHIVO_ID, P_NOMBRE_ARCHIVO);
      V_LOTEARCHIVO.IDLOTE := V_IDLOTE; P_CAPTURA := V_IDLOTE;
      SP_ALTER_CHARACTER_SESSION;
      
      
      SP_VERIFICAR_ARCHIVO('ENTRADATARJETA_EXT', V_LINEAS, V_ERROR);
      IF V_LINEAS = 1 THEN -- Verifica si existe el archivo
        
        OPEN V_CURSOR FOR SELECT * FROM ENTRADATARJETA_EXT;
        LOOP
          FETCH V_CURSOR BULK COLLECT INTO V_ENTRADATARJETA LIMIT 500;
          EXIT WHEN V_ENTRADATARJETA.NUMERO_LINEA.COUNT = 0;
          
          BEGIN
            FORALL I IN 1 .. V_ENTRADATARJETA.NUMERO_LINEA.COUNT SAVE EXCEPTIONS
              INSERT INTO ENTRADATARJETA(
                  CODIGOSECUENCIAL
                , BINTARJETA
                , NUMEROTARJETA
                , TIPOTARJETA
                , DESCRIPCIONTARJETA
                , ENTIDADCONTRATO
                , OFICINACONTRATO
                , TIPOCONTRATO
                , NUMEROCONTRATO
                , MONTOLIMITE
                , MONTODISPUESTO
                , INDICADORSITUACION
                , CODIGOCALIDAD
                , SECUENCIAINTERVENCION
                , USUARIOREGISTRO
                , FECHAREGISTRO
                , IDLOTE
              ) VALUES  (
                  SQ_ENTRADATARJETA.NEXTVAL
                , V_ENTRADATARJETA.BINTARJETA(I)
                , V_ENTRADATARJETA.NUMEROTARJETA(I)
                , V_ENTRADATARJETA.TIPOTARJETA(I)
                , V_ENTRADATARJETA.DESCRIPCIONTARJETA(I)
                , V_ENTRADATARJETA.ENTIDADCONTRATO(I)
                , V_ENTRADATARJETA.OFICINACONTRATO(I)
                , V_ENTRADATARJETA.TIPOCONTRATO(I)
                , V_ENTRADATARJETA.NUMEROCONTRATO(I)
                , V_ENTRADATARJETA.MONTOLIMITE(I)
                , V_ENTRADATARJETA.MONTODISPUESTO(I)
                , V_ENTRADATARJETA.INDICADORSITUACION(I)
                , V_ENTRADATARJETA.CODIGOCALIDAD(I)
                , V_ENTRADATARJETA.SECUENCIAINTERVENCION(I)
                , USER
                , SYSDATE
                , V_IDLOTE
              );
            EXCEPTION
              WHEN DML_ERRORS THEN
                V_NUMERO_ERRORES := SQL%BULK_EXCEPTIONS.COUNT;
                FOR IDX IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
                LOOP
                  V_ERROR := 'OCURRIO UN ERROR EN LA LINEA [' || V_ENTRADATARJETA.NUMERO_LINEA(SQL%BULK_EXCEPTIONS(IDX).ERROR_INDEX) || '] ' || SQLERRM(-SQL%BULK_EXCEPTIONS(IDX).ERROR_CODE);
                  V_LINEAS_CON_ERROR := V_LINEAS_CON_ERROR + 1;
                  SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, V_ERROR);
                END LOOP;
          END;
          
          IF V_NUMERO_ERRORES = 0 THEN
            V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + V_ENTRADATARJETA.NUMERO_LINEA.COUNT;
          ELSE 
            IF (V_ENTRADATARJETA.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES) > 0 THEN
              V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + (V_ENTRADATARJETA.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES);
            END IF;
          END IF;
          
          V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
          V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ENPROCESO;
          
          P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
          COMMIT;
          
          V_NUMERO_ERRORES := 0;
        END LOOP;
        
        CLOSE V_CURSOR;
        COMMIT;
        DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
                
        V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
        V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
        
        IF V_LINEAS_CON_ERROR > 0 THEN
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_ERRARDO;
        ELSE
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_TERMINADO;
        END IF;
        
      ELSE
        V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
        V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
        V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
        
        SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'ARCHIVO NO ENCONTRADO');
      END IF;
      
      P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
      COMMIT;
      
    ELSE
      SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'EL PROCESO YA FUE EJECUTADO');
      COMMIT;
    END IF;
    
    OPEN P_ERROR FOR SELECT * FROM ERROR_PROCESO_TEMP WHERE ID_LOTE=V_IDLOTE AND CODIGO_ARCHIVO=P_ARCHIVO_ID;
  EXCEPTION
  WHEN OTHERS THEN
    V_ERROR := SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
    
    ROLLBACK;
    
    SELECT COUNT(1) INTO V_LINEAS_CORRECTAS FROM ENTRADATARJETA_EXT;
    V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ERRARDO;
    P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
    COMMIT;
    
    OPEN P_ERROR FOR SELECT V_IDLOTE ID_LOTE
         , P_ARCHIVO_ID CODIGO_ARCHIVO
         , NVL(V_ERROR, 'ERROR NO ESPECIFICADO') MENSAJE_ERROR
         , SYSDATE FECHA_ERROR
    FROM DUAL;
  END SP_CARGAR_ENTRADATARJETA;
  
  PROCEDURE SP_CARGAR_ENTRADAPRODUCTO (P_ARCHIVO_ID INTEGER, P_NOMBRE_ARCHIVO VARCHAR2, P_CAPTURA OUT INTEGER, P_ERROR OUT SYS_REFCURSOR) IS
    V_ERROR             VARCHAR2(2000) := '';
    V_IDLOTE            NUMBER := 0;
    V_LOTEARCHIVO       LOTEARCHIVO%ROWTYPE;
    V_LINEAS            NUMBER := 0;
    V_LINEAS_CORRECTAS  NUMBER := 0;
    V_LINEAS_CON_ERROR  NUMBER := 0;
    V_NUMERO_ERRORES    NUMBER := 0;
    V_EJECUTADO         NUMBER := 0;
    V_ENTRADAPRODUCTO T_ENTRADAPRODUCTO;
    V_CURSOR            SYS_REFCURSOR;
    DML_ERRORS          EXCEPTION;
    PRAGMA EXCEPTION_INIT (DML_ERRORS, -24381);
  BEGIN
    P_CAPTURA := 0;
    
    V_LOTEARCHIVO.IDLOTE            := 0;
    V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
    V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
    V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
    
    V_EJECUTADO := FN_REGISTRAR_EJECUCION(P_ARCHIVO_ID);
    
    IF V_EJECUTADO = 1 THEN
      V_IDLOTE := P_REGISTRAR_LOTEARCHIVO(P_ARCHIVO_ID, P_NOMBRE_ARCHIVO);
      V_LOTEARCHIVO.IDLOTE := V_IDLOTE; P_CAPTURA := V_IDLOTE;
      SP_ALTER_CHARACTER_SESSION;
      
      
      SP_VERIFICAR_ARCHIVO('ENTRADAPRODUCTO_EXT', V_LINEAS, V_ERROR);
      IF V_LINEAS = 1 THEN -- Verifica si existe el archivo
        
        OPEN V_CURSOR FOR SELECT * FROM ENTRADAPRODUCTO_EXT;
        LOOP
          FETCH V_CURSOR BULK COLLECT INTO V_ENTRADAPRODUCTO LIMIT 500;
          EXIT WHEN V_ENTRADAPRODUCTO.NUMERO_LINEA.COUNT = 0;
          
          BEGIN
            FORALL I IN 1 .. V_ENTRADAPRODUCTO.NUMERO_LINEA.COUNT SAVE EXCEPTIONS
              INSERT INTO ENTRADAPRODUCTO(
                  CODIGOSECUENCIAL
                , CODIGOPRODUCTO
                , CODIGOSUBPRODUCTO
                , DESCRIPCIONPRODUCTO
                , DESCRIPCIONSUBPRODUCTO
                , INDICADORCTAESP
                , INDICADORCTAEMP
                , USUARIOREGISTRO
                , FECHAREGISTRO
                , IDLOTE
              ) VALUES  (
                  SQ_ENTRADAPRODUCTO.NEXTVAL
                , V_ENTRADAPRODUCTO.CODIGOPRODUCTO(I)
                , V_ENTRADAPRODUCTO.CODIGOSUBPRODUCTO(I)
                , V_ENTRADAPRODUCTO.DESCRIPCIONPRODUCTO(I)
                , V_ENTRADAPRODUCTO.DESCRIPCIONSUBPRODUCTO(I)
                , V_ENTRADAPRODUCTO.INDICADORCTAESP(I)
                , V_ENTRADAPRODUCTO.INDICADORCTAEMP(I)
                , USER
                , SYSDATE
                , V_IDLOTE
              );
            EXCEPTION
              WHEN DML_ERRORS THEN
                V_NUMERO_ERRORES := SQL%BULK_EXCEPTIONS.COUNT;
                FOR IDX IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
                LOOP
                  V_ERROR := 'OCURRIO UN ERROR EN LA LINEA [' || V_ENTRADAPRODUCTO.NUMERO_LINEA(SQL%BULK_EXCEPTIONS(IDX).ERROR_INDEX) || '] ' || SQLERRM(-SQL%BULK_EXCEPTIONS(IDX).ERROR_CODE);
                  V_LINEAS_CON_ERROR := V_LINEAS_CON_ERROR + 1;
                  SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, V_ERROR);
                END LOOP;
          END;
          
          IF V_NUMERO_ERRORES = 0 THEN
            V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + V_ENTRADAPRODUCTO.NUMERO_LINEA.COUNT;
          ELSE 
            IF (V_ENTRADAPRODUCTO.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES) > 0 THEN
              V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + (V_ENTRADAPRODUCTO.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES);
            END IF;
          END IF;
          
          V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
          V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ENPROCESO;
          
          P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
          COMMIT;
          
          V_NUMERO_ERRORES := 0;
        END LOOP;
        
        CLOSE V_CURSOR;
        COMMIT;
        DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
                
        V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
        V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
        
        IF V_LINEAS_CON_ERROR > 0 THEN
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_ERRARDO;
        ELSE
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_TERMINADO;
        END IF;
        
      ELSE
        V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
        V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
        V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
        
        SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'ARCHIVO NO ENCONTRADO');
      END IF;
      
      P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
      COMMIT;
      
    ELSE
      SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'EL PROCESO YA FUE EJECUTADO');
      COMMIT;
    END IF;
    
    OPEN P_ERROR FOR SELECT * FROM ERROR_PROCESO_TEMP WHERE ID_LOTE=V_IDLOTE AND CODIGO_ARCHIVO=P_ARCHIVO_ID;
  EXCEPTION
  WHEN OTHERS THEN
    V_ERROR := SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
    
    ROLLBACK;
    
    SELECT COUNT(1) INTO V_LINEAS_CORRECTAS FROM ENTRADAPRODUCTO_EXT;
    V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ERRARDO;
    P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
    COMMIT;
    
    OPEN P_ERROR FOR SELECT V_IDLOTE ID_LOTE
         , P_ARCHIVO_ID CODIGO_ARCHIVO
         , NVL(V_ERROR, 'ERROR NO ESPECIFICADO') MENSAJE_ERROR
         , SYSDATE FECHA_ERROR
    FROM DUAL;
  END SP_CARGAR_ENTRADAPRODUCTO;
  
  PROCEDURE SP_CARGAR_ENTRADACENTRO (P_ARCHIVO_ID INTEGER, P_NOMBRE_ARCHIVO VARCHAR2, P_CAPTURA OUT INTEGER, P_ERROR OUT SYS_REFCURSOR) IS
    V_ERROR             VARCHAR2(2000) := '';
    V_IDLOTE            NUMBER := 0;
    V_LOTEARCHIVO       LOTEARCHIVO%ROWTYPE;
    V_LINEAS            NUMBER := 0;
    V_LINEAS_CORRECTAS  NUMBER := 0;
    V_LINEAS_CON_ERROR  NUMBER := 0;
    V_NUMERO_ERRORES    NUMBER := 0;
    V_EJECUTADO         NUMBER := 0;
    V_ENTRADACENTRO T_ENTRADACENTRO;
    V_CURSOR            SYS_REFCURSOR;
    DML_ERRORS          EXCEPTION;
    PRAGMA EXCEPTION_INIT (DML_ERRORS, -24381);
  BEGIN
    P_CAPTURA := 0;
    
    V_LOTEARCHIVO.IDLOTE            := 0;
    V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
    V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
    V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
    
    V_EJECUTADO := FN_REGISTRAR_EJECUCION(P_ARCHIVO_ID);
    
    IF V_EJECUTADO = 1 THEN
      V_IDLOTE := P_REGISTRAR_LOTEARCHIVO(P_ARCHIVO_ID, P_NOMBRE_ARCHIVO);
      V_LOTEARCHIVO.IDLOTE := V_IDLOTE; P_CAPTURA := V_IDLOTE;
      SP_ALTER_CHARACTER_SESSION;
      
      
      SP_VERIFICAR_ARCHIVO('ENTRADACENTRO_EXT', V_LINEAS, V_ERROR);
      IF V_LINEAS = 1 THEN -- Verifica si existe el archivo
        
        OPEN V_CURSOR FOR SELECT * FROM ENTRADACENTRO_EXT;
        LOOP
          FETCH V_CURSOR BULK COLLECT INTO V_ENTRADACENTRO LIMIT 500;
          EXIT WHEN V_ENTRADACENTRO.NUMERO_LINEA.COUNT = 0;
          
          BEGIN
            FORALL I IN 1 .. V_ENTRADACENTRO.NUMERO_LINEA.COUNT SAVE EXCEPTIONS
              INSERT INTO ENTRADACENTRO(
                  CODIGOSECUENCIAL
                , CODIGOENTIDAD
                , CODIGOOFICINA
                , NOMBREOFICINA
                , USUARIOREGISTRO
                , FECHAREGISTRO
                , IDLOTE
              ) VALUES  (
                  SQ_ENTRADACENTRO.NEXTVAL
                , V_ENTRADACENTRO.CODIGOENTIDAD(I)
                , V_ENTRADACENTRO.CODIGOOFICINA(I)
                , V_ENTRADACENTRO.NOMBREOFICINA(I)
                , USER
                , SYSDATE
                , V_IDLOTE
              );
            EXCEPTION
              WHEN DML_ERRORS THEN
                V_NUMERO_ERRORES := SQL%BULK_EXCEPTIONS.COUNT;
                FOR IDX IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
                LOOP
                  V_ERROR := 'OCURRIO UN ERROR EN LA LINEA [' || V_ENTRADACENTRO.NUMERO_LINEA(SQL%BULK_EXCEPTIONS(IDX).ERROR_INDEX) || '] ' || SQLERRM(-SQL%BULK_EXCEPTIONS(IDX).ERROR_CODE);
                  V_LINEAS_CON_ERROR := V_LINEAS_CON_ERROR + 1;
                  SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, V_ERROR);
                END LOOP;
          END;
          
          IF V_NUMERO_ERRORES = 0 THEN
            V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + V_ENTRADACENTRO.NUMERO_LINEA.COUNT;
          ELSE 
            IF (V_ENTRADACENTRO.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES) > 0 THEN
              V_LINEAS_CORRECTAS := V_LINEAS_CORRECTAS + (V_ENTRADACENTRO.NUMERO_LINEA.COUNT - V_NUMERO_ERRORES);
            END IF;
          END IF;
          
          V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
          V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
          V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ENPROCESO;
          
          P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
          COMMIT;
          
          V_NUMERO_ERRORES := 0;
        END LOOP;
        
        CLOSE V_CURSOR;
        COMMIT;
        DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
                
        V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS + V_LINEAS_CON_ERROR;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := V_LINEAS_CORRECTAS;
        V_LOTEARCHIVO.CANTIDADERRADOS   := V_LINEAS_CON_ERROR;
        
        IF V_LINEAS_CON_ERROR > 0 THEN
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_ERRARDO;
        ELSE
          V_LOTEARCHIVO.ESTADO := G_ESTADO_CARGA_TERMINADO;
        END IF;
        
      ELSE
        V_LOTEARCHIVO.CANTIDADREGISTROS := 0;
        V_LOTEARCHIVO.CANTIDADCORRECTOS := 0;
        V_LOTEARCHIVO.CANTIDADERRADOS   := 0;
        V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_PERDIDO;
        
        SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'ARCHIVO NO ENCONTRADO');
      END IF;
      
      P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
      COMMIT;
      
    ELSE
      SP_REGISTRAR_ERROR(V_IDLOTE, P_ARCHIVO_ID, 'EL PROCESO YA FUE EJECUTADO');
      COMMIT;
    END IF;
    
    OPEN P_ERROR FOR SELECT * FROM ERROR_PROCESO_TEMP WHERE ID_LOTE=V_IDLOTE AND CODIGO_ARCHIVO=P_ARCHIVO_ID;
  EXCEPTION
  WHEN OTHERS THEN
    V_ERROR := SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
    
    ROLLBACK;
    
    SELECT COUNT(1) INTO V_LINEAS_CORRECTAS FROM ENTRADACENTRO_EXT;
    V_LOTEARCHIVO.CANTIDADREGISTROS := V_LINEAS_CORRECTAS;
    V_LOTEARCHIVO.ESTADO            := G_ESTADO_CARGA_ERRARDO;
    P_ACTUALIZAR_LOTEARCHIVO(V_LOTEARCHIVO);
    COMMIT;
    
    OPEN P_ERROR FOR SELECT V_IDLOTE ID_LOTE
         , P_ARCHIVO_ID CODIGO_ARCHIVO
         , NVL(V_ERROR, 'ERROR NO ESPECIFICADO') MENSAJE_ERROR
         , SYSDATE FECHA_ERROR
    FROM DUAL;
  END SP_CARGAR_ENTRADACENTRO;
  
  
END PQ_ARCHIVO;
/

spool off
